2012-02-17 63 views
1

我有一个表单,表单输入不是英语语言。
当点击提交按钮时,我正在使用POST方法获取字符串。现在我想在一个名为'translate.php'的新文件中编写字符串。如果我用fwrite的工作正确的英语,但其他语言如“保加利亚”会写这样1НАЧАЛО 实际字的Unicode标准EN:首页
在保加利亚:Н А Ч А Л О。
我可以写英文,但我不能写在保加利亚使用fwrite。
请任何人都可以帮助我。如何在PHP中使用fwrite编写保加利亚字符

回答

1

这不是fwrite这是变换你的字符,这些是HTML实体,而不是Unicode。我猜你的网站的编码设置为Latin-1。这意味着浏览器会将输入的数据提交到以拉丁文-1编码的服务器中。保加利亚语不在Latin-1范围内,因此不能编码,因此浏览器会将这些字符编码为HTML实体。

两个解决方案:

  1. 使用html_entity_decode($str, ENT_COMPAT, 'UTF-8')的形式,因此在解码的HTML实体实际UTF-8
  2. (首选)为你的网站在UTF-8和/或设置accept-charset="utf-8"属性浏览器将向服务器提交UTF-8数据

要深入研究,请参阅Handling Unicode in a Webapp

+0

哇!谢谢你,伟大的人。 – yogi46 2012-02-17 07:08:57

+2

@ yogi46:如果这对你有效,你应该接受答案。 – 2012-07-12 10:56:48

0

我不知道你的代码是什么样子,但你可以尝试:

.... 
$string = utf8_encode($posted_string); 
$f = fopen('/path/to/translate.php',"w"); 
fwrite($f, $string); 
fclose($f); 
.... 
+0

'utf8_encode'将Latin-1编码的字符串转换为UTF-8。除非要将Latin-1编码的文本转换为UTF-8编码的文本,否则这根本没有用。 – deceze 2012-02-17 07:36:42

+0

是的,多数民众赞成在想法..因为我认为网站编码设置为拉丁-1。 – mlinuxgada 2012-02-17 07:39:03

+0

但拉丁-1不能编码保加利亚字符开始... – deceze 2012-02-17 07:40:51

1

不知道这是不是你的情况,但是当你需要UTF8内容的文件在其他应用程序,它具有包含标题为UTF8文件的标题。

我使用下面的代码写入文件并将其作为下载文件提供给浏览器。见线以下add UTF-8 byte order mark

header('Content-type: text/plain; charset=utf-8'); 
header('Content-Disposition: attachment; filename="UTF8 encoded file.sql"'); 
$f= fopen('php://output', 'w'); 
// add UTF-8 byte order mark 
fwrite($f, pack("CCC",0xef,0xbb,0xbf)); 
fwrite($f, $fileOutput); 
fclose($f); 

同样,这只是要心目中如果当前写入文件不能按预期工作的方法(你没有张贴的代码)。

+0

对于UTF-8,BOM不*“*需要”。它是可选的,一些软件期望它,其他支持它,而其他*失败*如果存在BOM。安全的选择是*不*包含BOM,只有在需要打开文件的应用程序需要BOM(主要是MS程序)时才包含它。 – deceze 2012-02-17 08:15:14

+0

是的,你是对的。这里可能不是这种情况,因为他写入的文件是'translate.php',可能只包含在其他的php脚本中。 – talereader 2012-02-17 08:21:51