本文补充一些PHP中不自带的多字节函数。
PHP默认自带的mbstring扩展中有一些以mb_
开头的专门用于处理多字节字符的函数,专门用以处理UTF-8编码的内容。
例如,UTF-8编码下同样是返回字符串长度的函数,strlen("焰华Honoka55")
的返回值是14(一个BMP汉字为三个字节),而mb_strlen("焰华Honoka55")
的返回值是10(一个汉字算作一个字符)。
不过,mbstring扩展提供的函数种类并不丰富,下面是一些笔者数据库课设中用到而补充的函数。
mb_substr_replace
mbstring扩展中有mb_substr
函数,但并没有substr_replace
函数的“mb版”。
substr_replace
函数的功能为替换字符串中子串,例如
|
|
上面的代码表示将'nidema zai Nihon!'
从第11个字符起的5个字符替换为'Shanghai'
,将打印“nidema zai Shanghai!”。当然,对于Unicode字符,该非多字节函数无法按预期处理。
下面是该函数的多字节版本的一个可行的实现。
|
|
使用例
为保护个人隐私,需要将姓名的第二个字改为“*
”,代码如下:
|
|
mb_fgetc
fgetc
函数也没有多字节版。该函数从文件指针中获取一个字符。当然,确切来说是一个字节。下面我们来实现它的多字节版(准确来说,是UTF-8版)。
|
|
这里令首字节与掩码按位与来判断读入一个字符需要读几个字节,192匹配U+0080~U+07FF(双字节),224匹配U+0800~U+FFFF(三字节),240匹配U+10000~U+1FFFFF(四字节),这是UTF-8编码下的实现。如果文件编码不是UTF-8,比如是GBK,则还需要换用其他的方法。而自动判断文件的编码方式需要更复杂的算法,没办法仅靠一个函数实现。
使用例
这里假设要读取的文件内容开头为“草😂”(U+8349
U+1F602
)。
|
|
还有很多函数没有可以直接用的多字节版,若遇到,可以就具体函数给出合适的相应解决方案。