UTF-8希伯来语编码和大问号



我读了很多文章,但我仍然不明白

我使用

从文件导入文本
$fp = fopen($storagename, 'r');
while ( !feof($fp) ){
    $line = fgets($fp, 2048);
    $delimiter = "t";
    $data = str_getcsv($line, $delimiter);
    print_r($data);
}

用于正确显示数字和英语charachers,我必须使用

str_replace("x00", '', $data[7])

,但是现在试图展示希伯来的charachter最终看起来像

我尝试使用iconv/mb_convert_encoding/utf8_decode/encode转换没有任何帮助..

任何帮助都很好

ucs-2是UTF-16的较旧版本,因此您可能应该尝试两者(自动检测文本编码不是防弹作业)。

我们有源编码。我们可以推测目标编码是UTF-8(因为这是2016年的明智选择,您的问题实际上被标记为UTF-8)。所以我们有我们需要的。

我们应该首先删除非标准的原始字节操作(例如,删除str_replace("x00", '', $data[7])和类似的代码)。然后,我们可以进行适当的转换。如果使用mb_convert_encoding(),则可能是:

$delimiter = "t";
$fp = fopen($storagename, 'r');
while ( !feof($fp) ){
    $line = mb_convert_encoding(fgets($fp, 2048), 'UTF-8', 'UCS-2LE');
    $data = str_getcsv($line, $delimiter);
    print_r($data);
}

您可以检查支持的编码列表。

但是我们在这里有一个潜在的问题:没有办法告诉str_getcsv()关于文件编码,因此它不可能识别您的UCS-2线结尾。

您可以根据CSV文件的大小尝试不同的解决方案。如果它很小,我将立即转换。否则,我将查看stream_get_line():

此函数几乎与fgets()几乎相同,除非它允许除标准 n, r和 r n以外的行定界符结束,并且不会返回定界线本身。

这是这样的:

$ending = mb_convert_encoding("n", 'UCS-2LE', 'UTF-8');
$line = mb_convert_encoding(stream_get_line($fp, 2048, $ending), 'UTF-8', 'UCS-2LE');

这应该与Unix线路结尾(n)和Windows Ones(rn)一起使用。

最新更新