【发布时间】:2012-02-17 20:54:01
【问题描述】:
我需要编写一个函数,将字符串的所有字符从左到右翻转。
例如:
Thė quiçk ḇrown fox jumṕềᶁ ovểr thë lⱥzy ȡog.
应该变成
.goş yzⱥl ëht rểvo ᶁềṕmuj xof nworḇ kçiuq ėhT
我可以将问题限制为 UTF-16(与 UTF-8 有相同的问题,只是不太常见)。
天真的解决方案
一个天真的解决方案可能会尝试flip all the things(例如逐字逐句,其中一个单词是 16 位 - 如果我们可以假设一个字节是16 位。我也可以说 character-for-character,其中 character 是数据类型 Char,表示单个代码点):
String original = "ɗỉf̴ḟếr̆ęnͥt";
String flipped = "";
foreach (Char c in s)
{
flipped = c+fipped;
}
导致文本翻转错误:
ɗỉf̴ḟếr̆ęnͥt̨tͥnę̆rếḟ̴fỉɗ
这是因为一个“字符”需要多个“代码点”。
ɗỉf̴ḟếr̆ęnͥt-
ɗỉf˜ḟếr˘˘ęnii@9865435
翻转每个“代码点”给出:
-
˛tinę˘rếếḟ˜f@98654352@@9865436
这不仅不是有效的 UTF-16 编码,而且不是相同的字符。
失败
问题发生在UTF-16编码时有:
- combining diacritics
- 另一个语言平面中的字符
在 UTF-8 编码中也会出现同样的问题,但有额外的情况
- 0..127 ASCII 范围之外的任何字符
我可以限制自己使用更简单的 UTF-16 编码(因为这是我使用的语言所具有的编码(例如 C#、Delphi)
在我看来,问题在于发现是否有许多后续代码点正在组合字符,并且需要与基本字形一起出现。
看到online text reverser site 没有考虑到这一点也很有趣。
注意:
- 任何解决方案都应假定无权访问 UTF-32 编码库(主要是因为我无权访问任何 UTF-32 编码库)
- 访问 UTF-32 编码库可以解决 UTF-8/UTF-16 语言平面问题,但不能解决组合变音符号问题
【问题讨论】:
-
有趣的问题,但你为什么要翻转字符串?许多用于显示文本的现代环境可以为您从右到左显示它。你想做什么?
-
哦,不!另一个虚构的问题! :)
-
@DavidGrayson 伪本地化测试。
标签: text unicode localization text-processing right-to-left