Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:将传入的字符串转换为UTF-8,而不提供任何编码信息_Php_Json_Encoding_Utf 8 - Fatal编程技术网

PHP:将传入的字符串转换为UTF-8,而不提供任何编码信息

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,它使用json_encode将数据输出为json。但是,有时数据会被推送到非UTF-8数据的API。因此,当试图输出此数据时,json_encode抛出一个异常,因为它只能处理UTF-8数据

我该怎么办?我可以强制每个传入的数据都是UTF8吗?这似乎很难,因为我不知道发送数据的编码方式

或者我应该尝试对传入数据运行json_encode,如果它无法编码,则返回错误


编辑:我忘了提到这是一个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将是最安全的做法