【发布时间】: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