cakePHP - fgetcsv -在UTF-8编码的web应用程序的输入引号丢失


cakePHP - fgetcsv - quote marks are lost from input in UTF-8 encoded web app

我试图从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_encodeutf8_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 = "&#12287;";
$str2 = "'";
$value = str_replace($str, $str2, $value);
$value = mysql_real_escape_string($value); 

如果这些对你有帮助,我很高兴。