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