ICONV功能和Windows-1252

Lea*_*eto 0 php imap character-encoding iconv

我有一个应用程序,用于从Webmail读取电子邮件并将数据保存在数据库中.我正在使用PHP的imap库来完成大部分工作.

问题是大多数电子邮件都有多个字符集(主要是ISO-8859-1和UTF-8),因此我必须从电子邮件中读取字符集,然后使用iconv函数将其解码为ISO-8859-1.

它适用于大多数字符集,但是当我读取Windows-1252字符集并尝试解码时,iconv函数没有返回任何内容.

如果我尝试将iconv函数更改为mb_convert_string,则它不会正确转换所有字符.

这是我的代码:

if( $part->parameters[$i]->attribute == 'charset' )
    $charset =  $part->parameters[$i]->value;

if (strtolower($charset) != 'iso-8859-1')
    $this->emailMessageTxt = iconv($charset, 'iso-8859-1', $this->emailMessageTxt);
Run Code Online (Sandbox Code Playgroud)

那里有错误吗?

Esa*_*ija 5

是的,您正在尝试从任何其他字符集转换为ISO-8859-1.ISO-8859-1根本不能代表许多字符,例如它不能代表字符.

你本应该反过来工作,把所有非UTF-8转换成UTF-8,它可以代表地球上的任何角色.

如果要忽略无法表示的字符,只需执行以下操作:

$utf8 = "€€€ money"; //My php files are saved in utf-8, don't mind that

$iso8859 = iconv( "UTF-8", "ISO-8859-1//IGNORE", $utf8 );

echo $iso8859; // " money"
Run Code Online (Sandbox Code Playgroud)

也就是说,转换为 "ISO-8859-1//IGNORE"

文件:

out_charset输出字符集.

如果将字符串// TRANSLIT附加到out_charset,则会激活音译.这意味着当一个角色无法在目标字符集中表示时,它可以通过一个或几个相似的字符来近似.如果附加字符串// IGNORE,则会无提示地丢弃无法在目标字符集中表示的字符.否则,从第一个非法字符中删除str,并生成E_NOTICE.