【问题标题】:Problem with encoding csv file to UTF-8 format (diacritics shows as Ø)将 csv 文件编码为 UTF-8 格式的问题(变音符号显示为 Ø)
【发布时间】:2019-12-31 09:23:48
【问题描述】:

我正在尝试使用我的工具将 CSV 行转换为字符串 - 它用于注册多个用户 - 但每次我在我的 CSV 文件中使用变音符号 (ěščřž) 编写名字/姓氏并使用我的工具将每一行转换为字符串时, 这些字符显示为奇怪的字符 Ø

我尝试了 utf8_encode($item) 和 mb_convert_encoding($item, 'UTF-8')。它根本没有用。 Iconv 返回“检测到输入字符串中的非法字符”

{
array_walk_recursive($row, function(&$item) {

    //Convert encoding to UTF-8 if its not UTF-8
    if(!mb_detect_encoding($item, 'utf-8', true)){
        $item = iconv(mb_detect_encoding($item), 'utf-8', $item);
    }
});

return $row;
}

mb_detect_encoding 在这些上返回 FALSE(就像它无法确定编码一样) - 但仅在使用像“Příjmení”这样的变音符号时。如果我写“Prijmeni”,那么 mb_detect_encoding 成功检测到编码为 UTF-8。

当我输入行“Řádek;Příjmení;Příjmení;Test;mail@mail.com”时,我期望输出数组

[0] => "Řádek"
[1] => "Příjmení"
[2] => "Příjmení"
[3] => "Test"
[4] => "mail@mail.com"

但是使用上面描述的代码,它返回数组

[0] => "Øádek"
[1] => "PØíjmení"
[2] => "PØíjmení"
[3] => "Test"
[4] => "mail@mail.com"

我将 CSV 文件读取为 splFileObject,编码为 UTF-8。如果我将它插入到 db 中,它与我描述的相同(Øádek ; Pøíjmení)(但这不是强制性的,我从 CSV 获取数据,而不是从数据库获取数据,)

感谢您提供解决此问题的任何想法

【问题讨论】:

  • 我怀疑你在使用 utf8_encode()mb_detect_encoding() 时并不知道它们的用途。以编程方式自动检测文件的编码基本上是不可能的,这就解释了为什么 PHP 没有内置函数。
  • 如果您不知道用户文本的字符编码,那么您已经丢失了数据。也许您可以在时间上逆流/返回到丢失之前的某个点,然后继续往下走。

标签: php csv encoding utf-8 diacritics


【解决方案1】:

我创建了一个解决方案来帮助您解决问题。

<?php

function getRightData($fullstring)
{
  $arrayExploded = explode(';', $fullstring);
  $arrayString = [];

  foreach($arrayExploded AS $key => $string){

    $utf8_chars = explode(' ', 'À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö');
    $utf8_double_encoded = array();
    foreach($utf8_chars as $utf8_char)
    {
      $utf8_double_encoded[] = utf8_encode(utf8_encode($utf8_char));
    }
    $arrayString[$key] = str_replace($utf8_double_encoded, $utf8_chars, $string);
  }

  return $arrayString;
}

print_r(getRightData('Řádek;Příjmení;Příjmení;Test;mail@mail.com'));

结果是

Array
(
    [0] => Řádek
    [1] => Příjmení
    [2] => Příjmení
    [3] => Test
    [4] => mail@mail.com
)

【讨论】:

    猜你喜欢
    • 2014-08-30
    • 1970-01-01
    • 2013-12-12
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2015-06-13
    • 2012-01-11
    相关资源
    最近更新 更多