从服务器获取文件时 Unicode 错误


unicode is wrong when get file from server

我想从谷歌下载这个链接,哪个mage txt文件由php。

当我通过浏览器执行此操作时,Unicode是正确的,并且所有事情都是正确的,但是当我通过curlfile_get_content执行此操作时,它包含错误的字母。什么是差异,我应该如何解决它?

由布劳尔下载

[[["سلام","hello",","]],[["感叹词",["سلام","هالو","الو"],[["سلام",["hello","hi","aloha","all hail"]],["هالو",["hallo","hello","halloo"]], ["الو",["hello"]]]],"en",,[["سلام",[5],0,0,0,1000,0,1,0]],[["hello",4,,,"],["hello",5,["سلام",1000,0,0],["خوش",0,0,0],["میهمان گرامی",0,0,0],["خوش آمدید",0,0,0],["درود کائبر",0,0,0]],[[0,5]],
"hello"]],,,[["en"]],65]

通过以下 PHP 脚本下载:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?php
$t = file_get_contents("http://translate.google.com/translate_a/t?client=t&hl=en&sl=auto&tl=fa&multires=1&prev=btn&ssel=0&tsel=3&uptl=fa&alttl=en&sc=1&text=hello");
$f = fopen("t.txt", "w+");
fwrite($f, $t);
fclose($f);
?>
</body></html>
[[["ÓáÇã","hello",","]],[["interjection",["ÓáÇã","åÇáæ","Çáæ"],[["ÓáÇã",["hello","hi","aloha","all hail"]],["åÇáæ",["hallo","hello","halloo"]], ["Çáæ",["hello"]],"en",,[["ÓáÇã",[5],0,0,1000,0,1,0]],[["hello",4,,,"],["hello",5,[["ÓáÇã",1000,0,0],["ÎæÔ",0,0,0],["ã''u06CCåãÇä ÑÇã''u06CC",0,0,0],["
ÎæÔ ÂãÏ''u06CCÏ
",0,0,0],["ÏÑæÏ ÇÑÈÑ",0,0,0]],[[0,5]],"hello"]]],,,[["en"]],4]

页眉:

标题是:HTTP/1.1 200 OK杂注:无缓存日期:2012 年 5 月 25 日星期五 22:29:12 GMT到期: 星期五, 25 五月 2012 22:29:12 GMT缓存控制:专用,最大年龄=600内容类型:文本/脚本;字符集=UTF-8内容语言:法语Set-Cookie: PREF=ID=b6c08a0545f50594:TM=1337984952:LM=1337984952:S=Sf1xcow2qPZrFeu0;expires=2014 年 5 月 25 日星期日 22:29:12 GMT;路径=/;域名=.谷歌.comX-内容类型选项:嗅探内容处置:附件服务器:HTTP 服务器(未知)X-XSS 保护: 1;模式=块传输编码:分块

添加参数ie=UTF-8oe=UTF-8查询 url 的字符串:

$t = file_get_contents("http://translate.google.com/translate_a/t?ie=UTF-8&oe=UTF-8&client=t&hl=en&sl=auto&tl=fa&multires=1&prev=btn&ssel=0&tsel=3&uptl=fa&alttl=en&sc=1&text=hello");

这曾经对我有用,因为我即将将大量代码扔进垃圾桶!也许它也会帮助你

iconv( 'CP1252', 'UTF-8', $string); 
echo

file_get_contents得到的东西到PHP输出中应该可以正常工作,因为你正在从UTF-8 JSON响应到UTF-8 HTML响应。在给定的 URL 上为我工作。

当您存储到文件时,您必须担心用于读取文件的工具正在使用哪种编码。只要您查看它的文本编辑器知道输出是 UTF-8,只需fwrite ing 就可以了。在 Windows 上,记事本可能会尝试在依赖于区域设置的默认 ("ANSI") 代码页中读取它,该代码页不会是 UTF-8。在西欧安装中,它将是代码页 1252,您将获得类似 سلام 的输出,用于سلام

(一种方法是将 UTF-8 假 BOM 放在文件的前面,并带有 fwrite($f, "'xef'xbb'xbf"); .这有点狡猾,因为 UTF-8 不需要字节顺序标记(它的字节顺序是固定的),并且它破坏了 UTF-8 的 ASCII 兼容性,但 Windows 工具喜欢假 BOM。另一种方法是获得更好的文本编辑器,允许您默认以 UTF-8 格式处理文件。

这里的内容略有不同,因为当您以 Windows 默认阿拉伯语编码(代码页 1256)保存سلام,然后在 Windows 默认西方编码(代码页 1252)中读取它时,您会得到ÓáÇã。这意味着您的测试中涉及某种额外的存储和加载步骤,这会弄乱编码。

如果它与Windows命令行工具有关,您不妨放弃,因为命令提示符和MSVCRT应用程序根本无法很好地与Unicode配合使用。