PHP - fgetcsv - кавычки теряются при вводе в веб-приложении в кодировке UTF-8 - PullRequest
0 голосов
/ 14 июля 2011

Я пытаюсь импортировать данные из файлов CSV в веб-приложение, использующее кодировку utf-8. Я использую fgetcsv (мне не нужно, если есть лучший способ). Я использую utf8_encode, чтобы попытаться перевести символы из любой кодировки файла. Когда я вызываю mb_check_encoding для строк, которые выходят из этого конкретного файла, я получаю 'ASCII'.

На входе есть несколько странных символов. utf8_encode имеет дело с символами é (где раньше они появлялись в виде черных алмазных вопросительных знаков). Однако он не переводит двойные кавычки и апострофы, а просто удаляет их.

Помощь высоко ценится, спасибо. Я использую CakePHP, на случай, если это даст мне еще несколько вариантов!

Редактировать - я имел в виду utf8_encode, а не utf8_decode.

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Вам нужен только один вызов iconv с правильной кодировкой для параметра $in_charset.

$utf8Text = iconv($inputCharset, 'UTF-8', $text);

Вам необходимо знать входную кодировку. Там нет никакого способа обойти это. Укажите, что все входные данные должны соответствовать стандарту ISO-8859-1 или как вам удобнее. Кроме того, узнайте, что представляет собой кодировка вашего ввода (спросите автора, проверьте себя в редакторе, что угодно). В качестве альтернативы, требуется, чтобы входные данные указывали в какой-либо кодировке.

Кодировка не является черной магией. Вам просто нужно знать, в какой кодировке находится какой-либо текст и в какой кодировке вы хотите, чтобы он был. Затем используйте функцию, подобную iconv, которая может аккуратно переводить символы из одной кодировки в другую. utf8_encode и utf8_decode переводятся между ISO-8859-1 и UTF-8. Их имена выбраны ужасно, поскольку они предполагают, что они могут автоматически переводить что угодно с UTF-8 и на него, но это не так.

1 голос
/ 14 июля 2011

Вы можете решить проблему странных символов, используя функцию ниже:

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); 

Буду рад, если они вам помогут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...