PHP 字符串函数:哪些适用于 UTF-8?
PHP string functions: which ones will work with UTF-8?
在 PHP documentation 中列出了在字节级别上工作的字符串函数。这适用于 SBCS 字符串,但不适用于 MBCS 字符串。幸运的是,一种著名的编码 UTF-8 向后兼容高达 7 位 US-ASCII。
从 PHP 5.6 开始,默认编码已更改为 UTF-8,但它的字符串函数还没有。众所周知的替代方案是 iconv, Multibyte String and Intl。如果以正确的方式编译,PCRE 函数也可以与 MBCS 兼容。
当 SBCS 年龄代码需要转换为 VMBCS (UTF-8) 合规性时,需要重写标准 PHP 字节字符串函数以确保 MBCS 安全。虽然最基本的函数(如 strpos()
)有一个 mb_*
变体(如 mb_strpos()
),但大多数 PHP 的字符串函数没有 mb_
对应物。为了继续使用,必须重写它们。
在第一阶段,需要确定哪些 SBCS 字符串函数可以工作,尽管它们具有面向字节的特性。有些已经在 SO 上被识别出来,我现在正在寻找的是一个完整的函数列表,这些函数可以与 UTF-8 一起使用,或者在谨慎使用时使用,例如仅使用 US-ASCII 的参数。澄清一下,问题不在于像 chr()
或 crc32()
这样的字节字符串函数,而是关于获取像这样的函数列表:
- 不安全:
count_chars()
计算字节,...
- 注意:只要参数是 US-ASCII,
ltrim()
就可以工作,...
- 安全:
str_repeat()
将使用 MBCS 字符串,...
有人知道这样的列表吗?
PHP standard string functions 无法正确处理多字节字符串。它们将参数作为单字节字符串处理,无论您传递给它们的字符串是什么类型。它们不对字符进行操作,而是对字节进行操作。
PHP 不保留每个字符串的编码。它以相同的方式处理所有这些。
PHP multi-byte string functions provided by the mbstring
PHP extension 可以处理多种字符编码,在编码之间进行转换并自动检测给定字符串的编码。它们对字符进行操作,并且能够处理固定长度编码(UTF-16,f.e。)和可变长度编码(UTF-8)。
核心 PHP SBCS 字符串函数
假设 default encoding of PHP is set to UTF-8,这些字符串函数可以工作:
echo
输出一个或多个字符串
html_entity_decode
将所有 HTML 实体转换为其适用的字符
htmlentities
将所有适用字符转换为 HTML 个实体 |更好地使用
htmlspecialchars_decode
将特殊 HTML 实体转换回字符
htmlspecialchars
将特殊字符转换为 HTML 个实体
implode
用字符串连接数组元素
join
内爆的别名
nl2br
在字符串中的所有换行符前插入 HTML 换行符
print
输出一个字符串
quotemeta
引用元字符
str_repeat
重复一个字符串
str_rot13
对字符串执行 rot13 转换
strip_tags
从字符串中去除 HTML 和 PHP 标签
stripcslashes
用 addcslashes 取消引用字符串
stripslashes
取消引用引用的字符串
不幸的是,所有其他字符串函数对 UTF-8 不起作用。
障碍:
- 大小写处理或空格不适用于 UTF-8
- 参数中的字符串长度和 return 值不在字符长度中
- 字符串处理导致数据损坏
- 字符串函数完全面向 ASCII
在某些情况下,当参数为 US-ASCII 且
长度是字节长度。
二进制字符串函数仍然有用:
bin2hex
将二进制数据转换为十六进制表示
chr
Return一个特定的字符(=byte)
convert_uudecode
解码 uuencoded 字符串
convert_uuencode
对字符串进行编码
crc32
计算字符串的crc32多项式
crypt
单向字符串散列
hex2bin
解码十六进制编码的二进制字符串
md5_file
计算给定文件的 md5 散列
md5
计算字符串的md5散列
ord
Return 字符的 ASCII 值(=byte)
sha1_file
计算文件的sha1散列值
sha1
计算字符串的sha1散列
配置函数不适用:
get_html_translation_table
Returns htmlspecialchars 和 htmlentities 使用的翻译 table
localeconv
获取数字格式信息
nl_langinfo
查询语言和地区信息
setlocale
设置地区信息
Regular expression functions编码转码功能暂不考虑
扩展
在很多情况下,Multibyte String
提供 UTF-8 变体:
mb_convert_case
对字符串执行大小写折叠
mb_parse_str
解析GET/POST/COOKIE数据并设置全局变量
mb_split
使用正则表达式拆分多字节字符串
mb_strcut
获取字符串的一部分
mb_strimwidth
获取指定宽度的截断字符串
mb_stripos
查找字符串在另一个字符串中首次出现的位置,不区分大小写
mb_stristr
查找字符串在另一个字符串中的第一次出现,不区分大小写
mb_strlen
获取字符串长度
mb_strpos
查找字符串在字符串中第一次出现的位置
mb_strrchr
查找一个字符在另一个字符串中的最后一次出现
mb_strrichr
查找一个字符在另一个字符串中的最后一次出现,不区分大小写
mb_strripos
查找字符串在另一个字符串中最后一次出现的位置,不区分大小写
mb_strrpos
查找字符串在字符串中最后一次出现的位置
mb_strstr
查找字符串在另一个字符串中的第一次出现
mb_strtolower
使字符串小写
mb_strtoupper
使字符串大写
mb_strwidth
Return 字符串宽度
mb_substr_count
统计子串出现的次数
mb_substr
获取字符串的一部分
和iconv提供了最少的字符串函数:
iconv_strlen
Returns 字符串的字符数
iconv_strpos
查找大海捞针第一次出现的位置
iconv_strrpos
大海捞针中最后一次出现的针
iconv_substr
截取字符串的一部分
最后Intl has a lot of extra and powerful Unicode features (but no regular expressions) as part of i18n。一些功能与其他字符串函数重叠。关于字符串函数,这些是:
在 PHP documentation 中列出了在字节级别上工作的字符串函数。这适用于 SBCS 字符串,但不适用于 MBCS 字符串。幸运的是,一种著名的编码 UTF-8 向后兼容高达 7 位 US-ASCII。
从 PHP 5.6 开始,默认编码已更改为 UTF-8,但它的字符串函数还没有。众所周知的替代方案是 iconv, Multibyte String and Intl。如果以正确的方式编译,PCRE 函数也可以与 MBCS 兼容。
当 SBCS 年龄代码需要转换为 VMBCS (UTF-8) 合规性时,需要重写标准 PHP 字节字符串函数以确保 MBCS 安全。虽然最基本的函数(如 strpos()
)有一个 mb_*
变体(如 mb_strpos()
),但大多数 PHP 的字符串函数没有 mb_
对应物。为了继续使用,必须重写它们。
在第一阶段,需要确定哪些 SBCS 字符串函数可以工作,尽管它们具有面向字节的特性。有些已经在 SO 上被识别出来,我现在正在寻找的是一个完整的函数列表,这些函数可以与 UTF-8 一起使用,或者在谨慎使用时使用,例如仅使用 US-ASCII 的参数。澄清一下,问题不在于像 chr()
或 crc32()
这样的字节字符串函数,而是关于获取像这样的函数列表:
- 不安全:
count_chars()
计算字节,... - 注意:只要参数是 US-ASCII,
ltrim()
就可以工作,... - 安全:
str_repeat()
将使用 MBCS 字符串,...
有人知道这样的列表吗?
PHP standard string functions 无法正确处理多字节字符串。它们将参数作为单字节字符串处理,无论您传递给它们的字符串是什么类型。它们不对字符进行操作,而是对字节进行操作。
PHP 不保留每个字符串的编码。它以相同的方式处理所有这些。
PHP multi-byte string functions provided by the mbstring
PHP extension 可以处理多种字符编码,在编码之间进行转换并自动检测给定字符串的编码。它们对字符进行操作,并且能够处理固定长度编码(UTF-16,f.e。)和可变长度编码(UTF-8)。
核心 PHP SBCS 字符串函数
假设 default encoding of PHP is set to UTF-8,这些字符串函数可以工作:
echo
输出一个或多个字符串html_entity_decode
将所有 HTML 实体转换为其适用的字符htmlentities
将所有适用字符转换为 HTML 个实体 |更好地使用htmlspecialchars_decode
将特殊 HTML 实体转换回字符htmlspecialchars
将特殊字符转换为 HTML 个实体implode
用字符串连接数组元素join
内爆的别名nl2br
在字符串中的所有换行符前插入 HTML 换行符print
输出一个字符串quotemeta
引用元字符str_repeat
重复一个字符串str_rot13
对字符串执行 rot13 转换strip_tags
从字符串中去除 HTML 和 PHP 标签stripcslashes
用 addcslashes 取消引用字符串
stripslashes
取消引用引用的字符串
不幸的是,所有其他字符串函数对 UTF-8 不起作用。 障碍:
- 大小写处理或空格不适用于 UTF-8
- 参数中的字符串长度和 return 值不在字符长度中
- 字符串处理导致数据损坏
- 字符串函数完全面向 ASCII
在某些情况下,当参数为 US-ASCII 且 长度是字节长度。
二进制字符串函数仍然有用:
bin2hex
将二进制数据转换为十六进制表示chr
Return一个特定的字符(=byte)convert_uudecode
解码 uuencoded 字符串convert_uuencode
对字符串进行编码crc32
计算字符串的crc32多项式crypt
单向字符串散列hex2bin
解码十六进制编码的二进制字符串md5_file
计算给定文件的 md5 散列md5
计算字符串的md5散列ord
Return 字符的 ASCII 值(=byte)sha1_file
计算文件的sha1散列值sha1
计算字符串的sha1散列
配置函数不适用:
get_html_translation_table
Returns htmlspecialchars 和 htmlentities 使用的翻译 table
localeconv
获取数字格式信息nl_langinfo
查询语言和地区信息setlocale
设置地区信息
Regular expression functions编码转码功能暂不考虑
扩展
在很多情况下,Multibyte String 提供 UTF-8 变体:
mb_convert_case
对字符串执行大小写折叠mb_parse_str
解析GET/POST/COOKIE数据并设置全局变量mb_split
使用正则表达式拆分多字节字符串mb_strcut
获取字符串的一部分mb_strimwidth
获取指定宽度的截断字符串mb_stripos
查找字符串在另一个字符串中首次出现的位置,不区分大小写mb_stristr
查找字符串在另一个字符串中的第一次出现,不区分大小写mb_strlen
获取字符串长度mb_strpos
查找字符串在字符串中第一次出现的位置mb_strrchr
查找一个字符在另一个字符串中的最后一次出现mb_strrichr
查找一个字符在另一个字符串中的最后一次出现,不区分大小写mb_strripos
查找字符串在另一个字符串中最后一次出现的位置,不区分大小写mb_strrpos
查找字符串在字符串中最后一次出现的位置mb_strstr
查找字符串在另一个字符串中的第一次出现mb_strtolower
使字符串小写mb_strtoupper
使字符串大写mb_strwidth
Return 字符串宽度mb_substr_count
统计子串出现的次数mb_substr
获取字符串的一部分
和iconv提供了最少的字符串函数:
iconv_strlen
Returns 字符串的字符数iconv_strpos
查找大海捞针第一次出现的位置iconv_strrpos
大海捞针中最后一次出现的针iconv_substr
截取字符串的一部分
最后Intl has a lot of extra and powerful Unicode features (but no regular expressions) as part of i18n。一些功能与其他字符串函数重叠。关于字符串函数,这些是: