【问题标题】:In PHP, How to convert unicode number strings into numbers correctly?在 PHP 中,如何将 unicode 数字字符串正确转换为数字?
【发布时间】:2012-12-19 16:50:31
【问题描述】:

我有用 unicode 编码的 csv 文件,当我使用 fgetcsv 或 fgets 读取它并尝试在 PHP 中将数字字符串用作整数时,只有字符串的第一个字符被转换为数字,即

$str='2012';
$num=$str + 0; OR $num=(int)$str;
echo $num;
results -> 2

如何正确转换这些 un​​icode 数字字符串?

我在 PHP 中使用从 unicode 到其他字符集的转换函数没有成功!

我知道的唯一方法是使用简单的文本编辑器,如记事本或记事本++,并将文件格式转换为 ANSI csv。

感谢您的帮助。

【问题讨论】:

  • "Unicode" 不是编码。微软所说的“Unicode”实际上是 UTF-16LE。
  • 您使用的是哪种类型的 Unicode?在 UTF-8 中,这应该可以工作。无论哪种方式,转换为ASCII,它肯定会工作。

标签: php string csv unicode ansi


【解决方案1】:

将其转换为其他编码,例如 UTF-8。

$str = mb_convert_encoding( $str, "UTF-8", "UTF-16LE");

你的字符串其实是这样的(手动构造的 UTF-16LE):

 $str = "2\x000\x001\x002\x00";

所以 php 读取第一个2,然后看到NUL,它不是一个数字,你得到2

顺便说一句,这里不处理 LE BOM (\xFF\xFE),所以请出示您的完整代码,我会看到。

【讨论】:

  • 感谢 Esailija,我可以将所有文件内容读入一个字符串并将其从 UTF-16LE 转换为 UTF-8,然后将其写回。然后使用 fgets 一次读取一行 csv 文件,除了在第一行的开头还有一个额外的字符,我仅在第一行使用 substr 将其删除。再次感谢。
  • @Mehrdad 如果您要这样做,如果文件有 BOM,请使用 UTF-16UTF-16LE 不幸的是不吃 BOM,所以它会在开始时出现在结果文件中
  • 我正在使用此代码并且它工作正常:$filestr = file_get_contents($path); $filestr = mb_convert_encoding($filestr, 'ASCII', 'UTF-16LE'); file_put_contents($path, substr($filestr, 1));
  • @Mehrdad 我没看到,我的答案左侧应该有一个绿色复选标记。见this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2012-01-21
相关资源
最近更新 更多