mb_internal_encoding()实际上意味着什么?

时间:2015-02-11 05:43:35

标签: php encoding utf-8

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。

为什么会出现这个问题?

2 个答案:

答案 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(一个字节)

UTF-8中的

= 0x20A0(两个字节)

mb_strlen返回给定编码类型的字符数(不是字节数)。

strlen("€")
>> 2
mb_strlen("€", 'UTF-8')
>> 1
strlen("A")
>> 1
mb_strlen("A", 'UTF-8')
>> 1