mb_substitute_character的作用是设置多字节字符串函数(mb_convert_encoding等)在转换时,遇到无法转换的字符所替代的字符。它的函数原型如下:
mb_substitute_character([ mixed $substchar = null ]): mixed
参数 $substchar:可选,指定替代字符的类型。
返回值:如果传入参数,返回之前的替代字符设置;如果不传参数,返回当前的替代字符设置。
$substchar参数可以接受以下类型的值:
整数值(0-255)
代表单字节字符的ASCII码。例如:
mb_substitute_character(63); // 设置替代字符为ASCII的问号 '?'
字符串
可以传入字符串,表示具体的替代字符。例如:
mb_substitute_character('?'); // 使用“替代字符”符号(U+FFFD)
预定义常量
PHP内置了几个常用的替代字符常量:
MB_SUBSTITUTE_NONE:不替代,遇到错误字符直接丢弃。
MB_SUBSTITUTE_CHARACTER:使用替代字符(通常是“?”或“?”)。
MB_SUBSTITUTE_ENTITY:使用HTML实体替代。
MB_SUBSTITUTE_STRING:自定义替代字符串(需额外配合 mb_substitute_character设置)。
例如:
mb_substitute_character(MB_SUBSTITUTE_CHARACTER);
传入非法的数字或字符串
许多初学者会随意传入一个数字或字符串,导致替代字符设置无效或出现意外结果。mb_substitute_character要求数字必须在0-255之间,字符串必须是单个字符或预定义常量。
忽略返回值
这个函数会返回之前的替代字符设置,忽略返回值可能会导致在复杂程序中难以追踪当前替代字符状态。
误用常量名
有时会拼写错误或者用错常量。例如,写成MB_SUBSTITUTE_CHAR而不是MB_SUBSTITUTE_CHARACTER,导致报错。
混淆替代字符与编码设置
mb_substitute_character只设置替代字符,与mb_internal_encoding或mb_detect_encoding无直接关系,但容易被误解。
<?php
// 设置替代字符为问号 '?'
mb_substitute_character(63);
$str = "こんにちは世界"; // "Hello world"日文
// 故意使用错误编码转换
$converted = mb_convert_encoding($str, "ASCII", "UTF-8");
echo $converted; // 无法转换的字符被替代为 '?'
?>
更多细节可以查看PHP官方文档:
<code>https://gitbox.net/manual/zh/function.mb-substitute-character.php</code>