0

我写了一个 php 脚本,它从 windows-client-software 接收 http POST 包。

Windows 客户端使用 C++ 的“ WinHttpClient ”。

WinHttpClient 将我发送的消息作为 wchar_t 发送。

现在的问题是,我收到了我的 PHP 文件中的消息,但是像“®”符号这样的一些符号显示为“®”。

据我所知,我无法将客户的字符集更改为 utf-8 或类似的东西。但也许这里的一些人知道如何将宽字符“转换”为 PHP 可以正常工作的 utf8。因为我必须将数据保存到仅使用 utf-8 运行的数据库中。

我尝试了以下方法,但它没有改变它:(

function ewchar_to_utf8($matches) {
    $ewchar = $matches[1];
    $binwchar = hexdec($ewchar);
    $wchar = chr(($binwchar >> 8) & 0xFF) . chr(($binwchar) & 0xFF);
    return iconv("unicodebig", "utf-8", $wchar);
}

function special_unicode_to_utf8($str) {
return preg_replace_callback("/\\\u([[:xdigit:]]{4})/i", "ewchar_to_utf8", $str);
}

也许你有一些想法:) 谢谢

4

3 回答 3

3

Windows wchar_t 是 UTF-16LE,所以试试$u8str = iconv('UTF-16LE', 'UTF-8', $input);

但是从我在 WinHttpClient 网站上看到的内容来看,它有一个_b_str类,因此您可以转换为字节 - 它没有说明这是否是通过 UTF-8,但如果所有其他方法都失败了,您可以使用WideCharToMultiByte()CP_UTF8代码页来获得适合 POST 的字节缓冲区。

于 2013-01-10T16:37:13.827 回答
1

这是一个很好的 PHP 函数,用于将您在 wchar_t 中获得的整个字符串转换为 UTF-8: http: //php.net/manual/en/function.mb-convert-encoding.php - 使用 PHP 信息确保您拥有的 PHP 版本支持多字节字符串。

如果您不确定使用 mb_detect_encoding() 的编码或使用 mb_check_encoding() 验证字符串是否采用特定编码,MultiByte 库可以为您提供帮助。

于 2013-01-10T16:48:39.580 回答
1

现在的问题是,我收到了我的 PHP 文件中的消息,但是像“®”符号这样的一些符号显示为“®”。

这意味着您已经有 UTF-8... 在 ISO-8859-1/Windows-1252 中被误解了。

如果是这样

<?php

echo $rsymbol; //Comes out as ®

然后您需要更改的所有内容:

<?php
header("Content-Type: text/html; charset=UTF-8");
echo $rsymbol; //Comes out as ®
于 2013-01-11T11:53:58.733 回答