【问题标题】:ctype_print() best solution for UTF-8 charactersctype_print() UTF-8 字符的最佳解决方案
【发布时间】:2014-10-03 10:41:19
【问题描述】:

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

ctype_print("Curaçao");

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

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

【问题讨论】:

  • 这个帖子讨论了这个问题,他们提供了解决方案,here

标签: php utf-8 ctype


【解决方案1】:

有一个 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 进行多次测试字符串迭代。

【讨论】:

  • @Petah 你复活的这个老歌有什么后续吗? (OP 已经很久没有出现了。)
【解决方案2】:

你可以试试下面的代码:

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

print ctype_print_unicode('Curaçao');

输出:

1

【讨论】:

【解决方案3】:

ctype_print 函数仅使用 ASCII 符号:

它是一个wrapper over C isprint 函数

使用正则表达式

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

【讨论】:

猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 2016-11-08
  • 2023-03-13
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
相关资源
最近更新 更多