将字符串解码为 PHP 中的西里尔符号
Decode string into cyrillic symbols in PHP
我有这样的字符串:
Óâàæàåìûé êëèåíò!
并想将其解码为西里尔字母。我已经尝试通过 mb_convert_encoding 解码,但没有得到正确的结果。
$string = 'Óâàæàåìûé êëèåíò!';
$stringEncode = mb_detect_encoding($string);
$result = mb_convert_encoding($string, "CP1251", $stringEncode);
echo $result //????????? ??????!
//Case with auto detect encoding return the same result
$result = mb_convert_encoding($string, "CP1251");
echo $result //????????? ??????!
我尝试使用不同的字符编码,但总是得到错误的结果。
正确的结果必须是:
Уважаемый клиент!
注意! 我正在尝试使用在线 services 对当前字符串进行编码并获得正确的结果。琴弦没有断。似乎 PHP 无法定义编码并将当前字符串转换为西里尔文。
感谢任何帮助!
UPD:
bin2hex 输出:
c393c3a2c3a0c3a6c3a0c3a5c3acc3bbc3a920c3aac3abc3a8c3a5c3adc3b22120c387c3a0c3a2c3b2c3b0c3a020c3adc3a5c3aec3a1c3b5c3aec3a4c3a8c3acc3ae20c3a2c3adc3a5c3b1c3b2c3a820c3acc3a8c3adc3a8c3acc3a0c3abc3bcc3adc3bbc3a920c3afc3abc3a0c3b2c3a5c3a620c3afc3ae20c3a7c3a0c3a9c3acc3b320c3a220c3b0c3a0c3a7c3acc3a5c3b0c3a52036343120c3b0c3b3c3a1c3abc3a5c3a92e20c384c3abc3bf20c3aec3afc3abc3a0c3b2c3bb20c3a2c3aec3b1c3afc3aec3abc3bcc3a7c3b3c3a9c3b2c3a5c3b1c3bc20c3abc3a8c3b7c3adc3bbc3ac20c3aac3a0c3a1c3a8c3adc3a5c3b2c3aec3ac20707572652e636f6d2e7275
"Where does that string come from originally?" - 最初我从 Api 得到 json 格式的响应,然后我使用 utf8_encode (如果我不使用这个函数 json_decode return null) 最后 json_decode return 给我一个数据数组:
[
'status' => '1',
'last_date' => '15.05.2018 10:00:17',
'last_timestamp' => '1526353217',
'send_date' => '15.05.2018 10:00:05',
'send_timestamp' => '1526353205',
'phone' => '79270212817',
'cost' => '6.24',
'sender_id' => 'PURE',
'status_name' => 'Äîñòàâëåíî',
'message' => 'Óâàæàåìûé êëèåíò!'
];
我认为您认为 PHP 无法处理此字符串中的某些字符的假设可能是正确的。我做了以下故障排除,但未能找到问题所在。似乎 mb_check_encoding
returns 转换 应该 是可能的,但由于某些原因它不起作用...
您可能需要进行手动转换:PHP Convert Windows-1251 to UTF 8
<?php
$utf8_string = 'Óâàæàåìûé êëèåíò!';
$cp1251_string = 'Уважаемый клиент!';
$utf8_detect = mb_detect_encoding($utf8_string, 'UTF-8');
$cp1251_detect = mb_detect_encoding($cp1251_string, 'CP1251');
$utf8_to_cp1251_check = mb_check_encoding($utf8_string, $cp1251_detect);
$cp1251_to_utf8_check = mb_check_encoding($cp1251_string, $utf8_detect);
$utf8_to_cp1251 = mb_convert_encoding($utf8_string, $cp1251_detect);
$cp1251_to_utf8 = mb_convert_encoding($cp1251_string, $utf8_detect);
$utf8_to_cp1251_icon = iconv( "UTF-8","CP1251//TRANSLIT", $utf8_string);
var_dump($utf8_string);
var_dump($cp1251_string);
echo PHP_EOL;
var_dump($utf8_detect);
var_dump($cp1251_detect);
echo PHP_EOL;
var_dump($utf8_to_cp1251_check);
var_dump($cp1251_to_utf8_check);
echo PHP_EOL;
var_dump($utf8_to_cp1251);
var_dump($cp1251_to_utf8);
echo PHP_EOL;
var_dump($utf8_to_cp1251_icon);
输出
string(32) "Óâàæàåìûé êëèåíò!"
string(32) "Уважаемый клиент!"
string(5) "UTF-8"
string(12) "Windows-1251"
bool(true)
bool(true)
string(17) "????????? ??????!"
string(32) "Уважаемый клиент!"
string(18) "???ae????? ??????!"
根据 deceze 建议,我为我的原始 Api 响应 (windows-1251) 获取了编码。比我重写我的 'prepare to json_decode' 代码并得到正确的结果。
//Replace this:
$contents = utf8_encode($response);
//To this:
$contents = mb_convert_encoding($response, 'utf-8', 'windows-1251');
$result = json_decode($contents);
注意! utf8_encode 将 ISO-8859-1 转换为 UTF-8 并且如果我们使用另一种编码传递数据(在我的例子中它 windows-1251) 进入这个函数,我们会得到意想不到的结果。非常感谢@mulquin 和@deceze 帮助我找出了这个问题。
PS:经常检查源数据的编码,不要重蹈我的覆辙:)
我有这样的字符串:
Óâàæàåìûé êëèåíò!
并想将其解码为西里尔字母。我已经尝试通过 mb_convert_encoding 解码,但没有得到正确的结果。
$string = 'Óâàæàåìûé êëèåíò!';
$stringEncode = mb_detect_encoding($string);
$result = mb_convert_encoding($string, "CP1251", $stringEncode);
echo $result //????????? ??????!
//Case with auto detect encoding return the same result
$result = mb_convert_encoding($string, "CP1251");
echo $result //????????? ??????!
我尝试使用不同的字符编码,但总是得到错误的结果。
正确的结果必须是:
Уважаемый клиент!
注意! 我正在尝试使用在线 services 对当前字符串进行编码并获得正确的结果。琴弦没有断。似乎 PHP 无法定义编码并将当前字符串转换为西里尔文。
感谢任何帮助!
UPD:
bin2hex 输出: c393c3a2c3a0c3a6c3a0c3a5c3acc3bbc3a920c3aac3abc3a8c3a5c3adc3b22120c387c3a0c3a2c3b2c3b0c3a020c3adc3a5c3aec3a1c3b5c3aec3a4c3a8c3acc3ae20c3a2c3adc3a5c3b1c3b2c3a820c3acc3a8c3adc3a8c3acc3a0c3abc3bcc3adc3bbc3a920c3afc3abc3a0c3b2c3a5c3a620c3afc3ae20c3a7c3a0c3a9c3acc3b320c3a220c3b0c3a0c3a7c3acc3a5c3b0c3a52036343120c3b0c3b3c3a1c3abc3a5c3a92e20c384c3abc3bf20c3aec3afc3abc3a0c3b2c3bb20c3a2c3aec3b1c3afc3aec3abc3bcc3a7c3b3c3a9c3b2c3a5c3b1c3bc20c3abc3a8c3b7c3adc3bbc3ac20c3aac3a0c3a1c3a8c3adc3a5c3b2c3aec3ac20707572652e636f6d2e7275
"Where does that string come from originally?" - 最初我从 Api 得到 json 格式的响应,然后我使用 utf8_encode (如果我不使用这个函数 json_decode return null) 最后 json_decode return 给我一个数据数组:
[
'status' => '1',
'last_date' => '15.05.2018 10:00:17',
'last_timestamp' => '1526353217',
'send_date' => '15.05.2018 10:00:05',
'send_timestamp' => '1526353205',
'phone' => '79270212817',
'cost' => '6.24',
'sender_id' => 'PURE',
'status_name' => 'Äîñòàâëåíî',
'message' => 'Óâàæàåìûé êëèåíò!'
];
我认为您认为 PHP 无法处理此字符串中的某些字符的假设可能是正确的。我做了以下故障排除,但未能找到问题所在。似乎 mb_check_encoding
returns 转换 应该 是可能的,但由于某些原因它不起作用...
您可能需要进行手动转换:PHP Convert Windows-1251 to UTF 8
<?php
$utf8_string = 'Óâàæàåìûé êëèåíò!';
$cp1251_string = 'Уважаемый клиент!';
$utf8_detect = mb_detect_encoding($utf8_string, 'UTF-8');
$cp1251_detect = mb_detect_encoding($cp1251_string, 'CP1251');
$utf8_to_cp1251_check = mb_check_encoding($utf8_string, $cp1251_detect);
$cp1251_to_utf8_check = mb_check_encoding($cp1251_string, $utf8_detect);
$utf8_to_cp1251 = mb_convert_encoding($utf8_string, $cp1251_detect);
$cp1251_to_utf8 = mb_convert_encoding($cp1251_string, $utf8_detect);
$utf8_to_cp1251_icon = iconv( "UTF-8","CP1251//TRANSLIT", $utf8_string);
var_dump($utf8_string);
var_dump($cp1251_string);
echo PHP_EOL;
var_dump($utf8_detect);
var_dump($cp1251_detect);
echo PHP_EOL;
var_dump($utf8_to_cp1251_check);
var_dump($cp1251_to_utf8_check);
echo PHP_EOL;
var_dump($utf8_to_cp1251);
var_dump($cp1251_to_utf8);
echo PHP_EOL;
var_dump($utf8_to_cp1251_icon);
输出
string(32) "Óâàæàåìûé êëèåíò!"
string(32) "Уважаемый клиент!"
string(5) "UTF-8"
string(12) "Windows-1251"
bool(true)
bool(true)
string(17) "????????? ??????!"
string(32) "Уважаемый клиент!"
string(18) "???ae????? ??????!"
根据 deceze 建议,我为我的原始 Api 响应 (windows-1251) 获取了编码。比我重写我的 'prepare to json_decode' 代码并得到正确的结果。
//Replace this:
$contents = utf8_encode($response);
//To this:
$contents = mb_convert_encoding($response, 'utf-8', 'windows-1251');
$result = json_decode($contents);
注意! utf8_encode 将 ISO-8859-1 转换为 UTF-8 并且如果我们使用另一种编码传递数据(在我的例子中它 windows-1251) 进入这个函数,我们会得到意想不到的结果。非常感谢@mulquin 和@deceze 帮助我找出了这个问题。
PS:经常检查源数据的编码,不要重蹈我的覆辙:)