【问题标题】:Does a reliable way to capitalize Unicode text exist?是否存在将 Unicode 文本大写的可靠方法?
【发布时间】:2016-11-01 14:19:51
【问题描述】:

我最近不得不处理一些使用 Unicode 字符串的复杂问题(使用 PHP,我非常熟悉的一种语言)。 mbstring 扩展并没有真正正常工作,我们在尝试大写 Unicode 字母时遇到了巨大的痛苦,这对于 ASCII 文本来说是一个微不足道的问题,已经通过各种方式解决了。

如果我必须用 ASCII 文本来解决这个问题,我可能会只取字符,检查它是否是一个字母,然后从它的 ASCII 值中减去 32,例如!但就目前而言,我找不到任何解释 Unicode 文本的大写问题是如何解决的:我是否需要存储一个完整的关联表来将每个小写字符映射到其相关的大写版本?我想(并希望)我会听到一个巨大的NO

问题的核心:在使用 Unicode 字符操作时,是否存在任何将小写正确转换为大写(和大写)的方法?如果是这种情况,应用了哪些策略?

对于这个测试,假设你没有任何可用的模块,但实际上是 ANY 模块:没有mbstring,没有iconv,什么都没有。此外,为了简单起见,假设已经解决了识别单个字符的问题,我们的String 对象有一个nextChar() 方法,可用于查找下一个字符,与它的字节长度无关。假设您要做的是获取一个字符串,使用nextChar() 对其进行迭代,并且对于每个字符,如果可能,将其大写。

如果不清楚或需要更多信息,请简单评论,我会尽力回答你的疑问,如果它们目前还没有比我更大;)

【问题讨论】:

  • 我认为这确实是通过表格完成的,并且更糟糕的是,因为该表格取决于文本的语言。一个例子是在土耳其语中,i 的大写字母是大写字母 İ。实际上,我认为做到这一点的唯一方法是找到一个可以为你做这件事的图书馆。
  • 你可能是对的,我注意到找到固定规则甚至非常困难!如果我们采用希腊语(U0391 - U03A9 表示大写),我们可以遵循“加 22”规则,但 U03A2 除外,但如果我们跳过它并移至科普特字母字符似乎遵循一种“加 1” ”。我猜 Unicode 会带来更多问题,直到我们找到一种更智能的方式来处理它!
  • 你必须知道你在做什么。移动文本很容易,但您必须小心了解该文本的编码。如果您开始进行排序、大写、截断等操作,您应该找到一个库。例如wrapper for ICU

标签: php string algorithm methods unicode


【解决方案1】:

您可以尝试 PortableUTF8 库,它是 mbstring 和 iconv 的替代方案。

http://pageconfig.com/post/portable-utf8

另一个有趣的库是 Stringy。它默认与 mbstring 一起使用,但如果找不到模块,它将使用 polyfill 包。

https://github.com/danielstjules/Stringy

为了提高对问题的了解,阅读起来很有趣:

What factors make PHP Unicode-incompatible?

希望对你有用。

【讨论】:

  • 感谢您的建议,但是如果您打开链接 (pageconfig.com/attachments/portable-utf8.php) 并查找 function utf8_case_table( ) 您会看到他正在使用映射表,而我的问题实际上是关于躲开它!我不是要我可以复制->粘贴->部署的东西,我希望能更多地了解可用的策略
  • 您好,我没有意识到portable-utf8 正在使用映射表。 php 和 unicode 的问题非常复杂……实际上 PHP6 被放弃的部分原因是 Unicode 问题。我相信你可以实现它。您可以深入研究 mbstring 扩展源代码,它是用 c 编写的,但构建您的版本可能需要大量时间。 github.com/php/php-src/blob/master/ext/mbstring/php_unicode.c
  • 绝对!这就是为什么我不打算重新发明轮子:P 我只是想更好地了解现有轮子是如何工作的。顺便说一句,Stringy 的东西很有趣,我只是觉得插入任何对foreach 的支持都没有用,我很确定它会占用单个字节,而不是字符,但它很有趣,谢谢分享!跨度>
  • github.com/php/php-src/blob/master/ext/mbstring/… 我想没有直接的方法可以避免它......
  • 我也有同样的结论,请告诉我们你的最终方法。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2015-10-12
  • 2020-12-31
  • 2011-01-19
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
相关资源
最近更新 更多