According to the PHP website它这样做:
encoding
是用于HTTP输入的字符编码名称 字符编码转换,HTTP输出字符编码 转换,以及字符串函数的默认字符编码 由mbstring模块定义。你应该注意到内部 编码与多字节正则表达式完全不同。
但我觉得这个解释还不足以让我理解。
我在PHP中使用CURL请求了一些API。我正在解析响应数据。响应标头包含Content-Length
。所以我相信Content-Length
显示出完全正确的价值。此外,mb_strlen($responseData)
的结果值与Content-Length
值相同。
如果我将内部编码值设置为mb_internal_encoding('UTF-8')
,顺便说一下,mb_strlen($responseData)
的结果值与以前不一样!
实际上,该值比以前小。
我的网络服务器编码,文件编码和接受编码都设置为UTF-8。
为什么会出现这个问题?
答案 0 :(得分:2)
PHP将字符串视为字节数组,就像字节的哑收集一样。它不知道编码或"字符"。 mb_ *函数是一组可识别编码的工具,可以逐个字符地处理字符串。例如,字符串"汉字"在UTF-8中长度为6个字节,但仅代表两个字符。为了能够逐个字符地处理字符串,mb_ *函数需要知道给定字符串的编码。每个mb_ *都接受$encoding
参数,因此您可以告诉它。 E.g:
mb_strlen('漢字', 'UTF-8') // 2
要一次性全局设置此编码,而不必将其传递到每个函数,那就是mb_internal_encoding
。它只记得编码设置,并且每个想要的功能都可以从中获取此设置。手册详细介绍了哪些功能可以使用它。
您的特殊问题"是HTTP Content-Length标头指定内容长度(以字节为单位)。该值是编码不可知的,实际上它的唯一目的是提醒客户端将遵循随后的有效负载的字节。此有效负载可以是任何内容,因此大小以字节为单位。如果您将其解释为给定编码中的字符,结果将会有所不同。
有关更多基础知识,请参阅What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text。
答案 1 :(得分:1)
Content-Length是字节中的响应大小。在ASCII中,Content-Length ==字符数。在UTF-8中,单个字符可以由多个字节组成,因此字符数将等于或小于Content-Length。
例如:
ASCII中的 A
= 0x41
(一个字节)
€
= 0x20A0
(两个字节)
mb_strlen
返回给定编码类型的字符数(不是字节数)。
strlen("€")
>> 2
mb_strlen("€", 'UTF-8')
>> 1
strlen("A")
>> 1
mb_strlen("A", 'UTF-8')
>> 1