2017-02-18 57 views
0

在我的PHP脚本中,我尝试将utf8字符发送到Google翻译网站,以便他们向我发送文本翻译,但这不适用于UTF8字符,例如中国,阿拉伯和俄罗斯,我不明白为什么。如果我试着翻译 'какдела' 英文我可以使用这个链接:https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=какделаPHP在URL中使用UTF8字符,url编码失败

而且,它还将返回此:[[[ “你好吗”, “какдела” ,,, 1] ,,“ru”]

一个很好的翻译,正是我想要的,但如果我尝试在PHP中重新创建它,我这样做(我在开始时使用了字节,因为我未来的脚本将使用字节作为起点):

<?php 
$bytes = array(1082,1072,1082,32,1076,1077,1083,1072); // bytes of: как дела 
$str = ""; 

for($i = 0; $i < count($bytes); ++$i) { 
    $str .= json_decode('"\u' . '0' . strtoupper(dechex($bytes[$i])) . '"'); // returns string: как дела 
} 

$from = 'ru'; 
$to = 'en'; 
$url = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=' . $from . '&tl=' . $to . '&dt=t&q=' . $str; 
$call = fopen($url,"r"); 
$contents = fread($call,2048); 

print $contents; 
?> 

,并将其输出:[[[ “RєRRєRґRμR°\” °F “” какдРμла” ,,, 0]] ,, “RU”]

输出没有意义,看起来我的PHP脚本会将字符串'какдРμла'翻译成英文。我读了一些关于在URI(或url)中使谷歌可读的UTF-8字符的东西。它说我应该将我的字节转换为UTF-8代码单元并将它们放入我的网址中。我还没有弄清楚如何将字节传输到UTF-8代码单元,但我首先想要尝试它是否工作。我开始将我的文本'какдела'转换为代码单元(包含URL的百分比)来自己测试它。这导致了以下链接:https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=%D0%BA%D0%B0%D0%BA+%D0%B4%D0%B5%D0%BB%D0%B0

而且在浏览器中进行测试时,它返回:[[[ “你好吗”, “какдела” ,,, 1] ,, “RU”]

再次细翻译,看来它的作品,所以我尝试用下面的代码来实现它在我的脚本:

<?php 
$from = 'ru'; 
$to = 'en'; 
$text = "%D0%BA%D0%B0%D0%BA+%D0%B4%D0%B5%D0%BB%D0%B0"; // code units of: как дела 
$url = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=' . $from . '&tl=' . $to . '&dt=t&q=' . $text; 
$call = fopen($url,"r"); 
$contents = fread($call,2048); 

print $contents; 
?> 

此脚本输出:[[[“RєRRєRґRμR°\”°F“”РєР° [0]] ,,“ru”]

再次我的脚本不会输出我想要什么,当我得到什么我在我自己的浏览器中测试这些URL。我无法弄清楚我做错了什么,以及为什么如果我在我的PHP文件中使用链接,google会回应一个乱七八糟的字符。

有人知道如何获得我想要的输出吗?提前致谢!

更新代码来设置字符串UTF8,(没有工作)

我加了很多设置在PHP文件的顶部,以确保一切都在UTF8格式。此外,我在中途添加了mb_convert_encoding,但输出仍然错误。 fopen函数不会将正确的UTF-8字符串发送到Google。

输出我得到:

URL: https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=%D0%BA%D0%B0%D0%BA%20%D0%B4%D0%B5%D0%BB%D0%B0 
Encoding: ASCII 
File contents: [[["RєR Rє RґRμR ° \"° F","как дела",,,0]],,"ru"] 

码我用:

<?php 
header('Content-Type: text/html; charset=utf-8'); 
$TYPO3_CONF_VARS['BE']['forceCharset'] = 'utf-8'; 
mb_internal_encoding('UTF-8'); 
mb_http_output('UTF-8'); 
mb_http_input('UTF-8'); 
mb_language('uni'); 
mb_regex_encoding('UTF-8'); 
ob_start('mb_output_handler'); 

$from = 'ru'; 
$to = 'en'; 
$text = rawurlencode('как дела'); 
$url = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=' . $from . '&tl=' . $to . '&dt=t&q=' . $text; 
$url = mb_convert_encoding($url, "UTF-8", "ASCII"); 
$call = fopen($url,"r"); 
$contents = fread($call,2048); 

print 'URL: ' . $url . '<br>'; 
print 'Encoding: ' . mb_detect_encoding($url) . '<br>';; 
print 'File contents: ' . $contents; 
?> 
+2

你的PHP不是默认的UTF-8编码。您需要在PHP代码中手动设置。 [阅读关于UTF-8](http://stackoverflow.com/questions/279170/utf-8-all-the-way-through)。你需要设置['mb_string'](http://www.php.net/manual/en/book.mbstring.php)属性。 – Martin

+1

***编辑***你的问题,不要在评论中张贴代码它是相当难以阅读的。干杯 – Martin

+0

我更新了开幕帖子。 – Sportline83

回答

0

解决了!我得到了另一个提示,不是从这些论坛看this stackoverflow post关于设置用户代理。经过一些更多的研究,我发现this答案是解决我的问题。现在一切正常!