PHP:将传入的字符串转换为UTF-8,而不提供任何编码信息
我有问题 我有一个RESTAPI,它使用json_encode将数据输出为json。但是,有时数据会被推送到非UTF-8数据的API。因此,当试图输出此数据时,json_encode抛出一个异常,因为它只能处理UTF-8数据 我该怎么办?我可以强制每个传入的数据都是UTF8吗?这似乎很难,因为我不知道发送数据的编码方式 或者我应该尝试对传入数据运行json_encode,如果它无法编码,则返回错误PHP:将传入的字符串转换为UTF-8,而不提供任何编码信息,php,json,encoding,utf-8,Php,Json,Encoding,Utf 8,我有问题 我有一个RESTAPI,它使用json_encode将数据输出为json。但是,有时数据会被推送到非UTF-8数据的API。因此,当试图输出此数据时,json_encode抛出一个异常,因为它只能处理UTF-8数据 我该怎么办?我可以强制每个传入的数据都是UTF8吗?这似乎很难,因为我不知道发送数据的编码方式 或者我应该尝试对传入数据运行json_encode,如果它无法编码,则返回错误 编辑:我忘了提到这是一个RESTAPI。因此,我收到了对我的API的POST请求,其中包含许多字段
编辑:我忘了提到这是一个RESTAPI。因此,我收到了对我的API的POST请求,其中包含许多字段和值。您可能想查看
iconv()
iconv-将字符串转换为请求的字符编码
您可以使用检测传入数据的编码,然后使用将数据转换为utf-8。我更喜欢mb_字符串函数。这是来自php.net的示例
/* Convert internal character encoding to SJIS */
$str = mb_convert_encoding($str, "SJIS");
/* Convert EUC-JP to UTF-7 */
$str = mb_convert_encoding($str, "UTF-7", "EUC-JP");
/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */
$str = mb_convert_encoding($str, "UCS-2LE", "JIS, eucjp-win, sjis-win");
/* "auto" is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS" */
$str = mb_convert_encoding($str, "EUC-JP", "auto");
您可能可以使用mb_detect_encoding()来猜测您得到的字符编码,但是猜测字符编码所涉及的试探法不到100%的可靠性,因此它可能仍然不起作用,更糟糕的是,您可能会损坏有效的字符串
如果JSON源发送内容类型头,它还应该包括(预期的)字符编码
Content-Type: application/json; charset=ISO-8859-4
如果这个信息是准确的,那么您可以使用它来进行代码转换 数据从何而来?输入的数据总是UTF-8或ISO-8859-1,还是其他编码也在混合中?这有多国际化?完全不同。一些来自Twitter StreamingApi客户端,一些来自电子邮件。可能是重复的。那么我应该在发送到我的API的POST请求中的每个字段上运行它吗?是的,任何需要转换为UTF-8的数据。如果您确定在一个请求中发布的所有数据都将采用相同的编码(即,您不希望在同一个请求中混合使用ISO-8859-1和中文字符),则在一个字段上检测编码,并使用该编码转换所有数据。应该很容易编写一个非常基本的函数来为您完成。从发送方获取编码信息的+1将是最安全的做法