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。

为什么会出现这个问题?

+0

没有问题。解码文本的长度被返回。 – 2015-02-11 05:45:30

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