【发布时间】:2014-10-03 10:41:19
【问题描述】:
在 PHP 中,让ctype_print()(或者这不可能吗?)与 UTF-8 一起工作的最佳方法是什么?目前,当我将它与一些 UTF-8 字符一起使用时,它会失败,例如:
ctype_print("Curaçao");
(在荷兰独立岛屿库拉索之后)返回false。
提前感谢您的时间和帮助。
【问题讨论】:
-
这个帖子讨论了这个问题,他们提供了解决方案,here
在 PHP 中,让ctype_print()(或者这不可能吗?)与 UTF-8 一起工作的最佳方法是什么?目前,当我将它与一些 UTF-8 字符一起使用时,它会失败,例如:
ctype_print("Curaçao");
(在荷兰独立岛屿库拉索之后)返回false。
提前感谢您的时间和帮助。
【问题讨论】:
有一个 PCRE/POSIX 正则表达式字符类可以匹配任何可打印字符 (reference)。当与 u 修饰符一起使用时,它将匹配任何 UTF-8 可打印字符:
[:print:] 这匹配与 [:graph:] 相同的字符加上不是控件的空格字符,即具有 Zs 属性的字符。
如果您只对字形感兴趣,并且空格算作禁止,您可以使用:
[:graph:] 这匹配具有在打印时标记页面的字形的字符。在 Unicode 属性术语中,它匹配具有 L、M、N、P、S 或 Cf 属性的所有字符
然后,您的正则表达式将如下所示:
preg_match('~^[[:print:]]+$~u', $string)
一个可能的函数如下所示:
function is_utf8_printable($string): bool {
return (bool) preg_match('~^[[:print:]]+$~u', $string);
}
这将告诉您是否所有字符(从字符串的 ^ 开头到 $ 结尾)都匹配 :print: 字符类。请see here 进行多次测试字符串迭代。
【讨论】:
你可以试试下面的代码:
function ctype_print_unicode($input) {
return preg_match("~^[\pL\pN\s\"\~". preg_quote("!#$%&'()*+,-./:;<=>?@[\]^_`{|}´") ."]+$~u", $input);
}
print ctype_print_unicode('Curaçao');
输出:
1
【讨论】:
【讨论】:
ctype_print工作:3v4l.org/N6NRK