ctype_print() UTF-8字符的最佳解决方案

ctype_print() best solution for UTF-8 characters

提问人:Jori 提问时间:8/10/2014 更新时间:12/16/2021 访问量:728

问:

在 PHP 中,让(或者这是不可能的)使用 UTF-8 的最佳方法是什么?目前,当我将它与一些 UTF-8 字符一起使用时,它会失败,例如:ctype_print()

ctype_print("Curaçao");

(在荷兰独立岛库拉索岛之后)返回.false

提前感谢您的时间和帮助。

PHP UTF-8 类型

评论

0赞 Faesal 12/11/2021
这个线程讨论了这个问题,他们提供了解决方案,这里

答:

0赞 cetver 12/12/2021 #1

这些函数仅使用 ASCII 符号:ctype_print

它是 C isprint 函数的包装器

使用正则表达式

function ctype_print_utf(string $string): bool
{
    return preg_match('/[[:cntrl:]]/', $string) === 0;
}

评论

0赞 Petah 12/14/2021
似乎不起作用:3v4l.org/L9CW9
0赞 cetver 12/14/2021
工作方式 : 3v4l.org/N6NRKctype_print
0赞 Dmitry Leiko 12/12/2021 #2

您可以尝试在下面使用代码:

function ctype_print_unicode($input) {
    return preg_match("~^[\pL\pN\s\"\~". preg_quote("!#$%&'()*+,-./:;<=>?@[\]^_`{|}´") ."]+$~u", $input);
}

print ctype_print_unicode('Curaçao');

输出:

1

评论

0赞 Petah 12/14/2021
3v4l.org/bGbMl
0赞 Markus AO 12/16/2021 #3

有一个 PCRE/POSIX 正则表达式字符类,它与任何可打印字符(引用)匹配。当与修饰符一起使用时,它将匹配任何 UTF-8 可打印字符:u

[:p rint:]这将匹配与 [:graph:] 相同的字符以及非控件的空格字符,即具有 Zs 属性的字符。

如果您只对字形感兴趣,并且空格算作禁忌,则可以使用:

[:图形:]这将匹配具有在打印时标记页面的字形的字符。在 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:

评论

0赞 Markus AO 12/24/2021
你复活的这首老歌有什么后续@Petah?(OP 已经存在很久了。