我试图从CSV文件导入数据到使用utf-8编码的web应用程序。我正在使用fgetcsv(如果有更好的方法,我不需要)。我使用utf8_encode来尝试从文件的编码中翻译字符。当我对来自这个特定文件的字符串调用mb_check_encoding时,我得到'ASCII'。
输入中有一些奇怪的字符。Utf8_encode很好地处理了
帮助非常感激,谢谢。我正在使用CakePHP,以防给我更多的选择!
编辑-我指的是utf8_encode,不是utf8_decode。
您只需要使用$in_charset
参数的正确字符集调用iconv
。
$utf8Text = iconv($inputCharset, 'UTF-8', $text);
您需要知道输入字符集。没有别的办法。制定一个规范,规定所有输入都必须符合ISO-8859-1,或者其他您喜欢的标准。或者,找出输入的字符集是什么(询问作者,在编辑器中测试自己,等等)。或者,要求输入需要以某种方式指定它在某个地方的编码。
编码不是黑魔法。你只需要知道一些文本的编码以及你想要它的编码。然后使用像iconv
这样的函数,可以清晰地将字符从一种编码转换为另一种编码。utf8_encode
和utf8_decode
在ISO-8859-1和UTF-8之间转换。它们的名称选择得很糟糕,因为它们暗示它们可以自动将任何内容从UTF-8转换为UTF-8,但事实并非如此。
您可以使用下面的函数来解决奇怪字符的问题:
function htmlallentities($str){
$res = '';
$strlen = strlen($str);
for($i=0; $i<$strlen; $i++){
$byte = ord($str[$i]);
if($byte < 128) // 1-byte char
$res .= $str[$i];
elseif($byte < 192); // invalid utf8
elseif($byte < 224) // 2-byte char
$res .= '&#'.((63&$byte)*64 + (63&ord($str[++$i]))).';';
elseif($byte < 240) // 3-byte char
$res .= '&#'.((15&$byte)*4096 + (63&ord($str[++$i]))*64 + (63&ord($str[++$i]))).';';
elseif($byte < 248) // 4-byte char
$res .= '&#'.((15&$byte)*262144 + (63&ord($str[++$i]))*4096 + (63&ord($str[++$i]))*64 + (63&ord($str[++$i]))).';';
}
return $res;
例如,对于撇号('),我使用了以下代码片段:
$value = "What’s your name?";
$value = htmlallentities(utf8_decode($value));
$str = "⿿";
$str2 = "'";
$value = str_replace($str, $str2, $value);
$value = mysql_real_escape_string($value);
如果这些对你有帮助,我很高兴。