在PHP中编写UTF-8编码文件的问题

时间:2010-08-20 16:31:31

标签: php encoding utf-8 character-encoding

我有一个包含世界国家/地区的大型文件,我根据各个国家/地区分成较小的文件。原始文件包含以下条目:

  EE.04 Järvamaa
  EE.05 Jõgevamaa
  EE.07 Läänemaa

然而,当我提取并将其写入新文件时,文本变为:

  EE.04  Järvamaa
  EE.05  Jõgevamaa
  EE.07  Läänemaa

要保存我的文件,我使用以下代码:

mb_detect_encoding($text, "UTF-8") == "UTF-8" ? : $text = utf8_encode($text);
$fp = fopen(MY_LOCATION,'wb');
fwrite($fp,$text);
fclose($fp);

我尝试使用和不使用utf8_encode()保存文件,似乎都不起作用。我如何保存原始编码(UTF8)?

谢谢!

5 个答案:

答案 0 :(得分:4)

首先,不要依赖mb_detect_encoding。除非有一堆特定于编码的实体(意味着在其他编码中无效的实体),否则找出编码是什么并不是很好。

尝试一起摆脱mb_detect_encoding行。

哦,utf8_encodeLatin-1字符串转换为UTF-8字符串(不是从任意字符集到UTF-8,这是你真正想要的)...你想要iconv,但是你需要知道源代码编码(因为你不能真正信任mb_detect_encoding,你需要通过其他方式来解决它)。

或者您可以尝试使用iconv空输入编码$str = iconv('', 'UTF-8', $str);(可能有效也可能无效)...

答案 1 :(得分:1)

它不起作用。即使您使用utf8_encode($ theString),也不会创建UTF8文件。

正确答案与 UTF-8字节顺序标记有关。

这是为了解问题: - http://en.wikipedia.org/wiki/Byte_order_mark
- http://unicode.org/faq/utf_bom.html

解决方案如下: 由于UTF-8字节顺序标记是'\ xef \ xbb \ xbf',我们应该将它添加到文档的标题中。

<?php
function writeStringToFile($file, $string){
$f=fopen($file, "wb");
$file="\xEF\xBB\xBF".$string; // utf8 bom
fputs($f, $string);
fclose($f);
}
?>

$ file可以是任何文本或xml ... $ string是您的UTF8编码字符串。

立即尝试,它将使用您的UTF8内容(字符串)编写UTF8编码文件。

writeStringToFile('test.xml', 'éèàç');

答案 2 :(得分:0)

也许您想在将htmlentities($text)写入文件之前调用html_entity_decode($fetchedData)并在输出之前调用{{1}}。它将与斯堪的纳维亚字母一起使用。

答案 3 :(得分:-1)

您可以按照以下方式执行此操作:

<?php
$s = "This is a string éèàç and it is in utf-8";
$f = fopen('myFile',"w");
fwrite($f, utf8_encode($s));
fclose($f);
?> 

答案 4 :(得分:-1)

事实上,您的源文件似乎不是UTF-8。您可能想尝试使用您一直使用的相同方法,但使用不同的编码,例如UTF-16。