【问题标题】:How to flip text horizontally?如何水平翻转文本?
【发布时间】: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编码时有:

在 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


【解决方案1】:

如果您使用 UTF-32,则可以解决非基本平面问题。从 UTF-8 或 UTF-16 转换为 UTF-32(以及返回)是相对简单的操作(参见 Wikipedia)。您不必拥有它的库。

大多数组合字符都在几个范围内。您可以通过扫描 Unicode 数据库来确定这些范围(参见 Unicode.org)。将这些范围硬编码到您的应用程序中。这样,您可以确定代表单个字符的代码点组。 (缺点是将来可能会引入新的组合标记,您需要更新表格。)

适当分段,颠倒顺序(逐段),然后转换回 UTF-8 或 UTF-16(或任何你想要的)。

【讨论】:

  • UTF-32 仍然有一个问题,即并非每个字符都是 4 字节。还是有变音符号的问题。
  • @IanBoyd:这就是我试图在第二段中提出的观点。
【解决方案2】:

您要查找的术语是“字素簇”,在 Unicode TR29 Cluster Boundaries 中定义。

使用代理算法(简单)将 UTF-16 代码单元分组为 Unicode 代码点(=字符),然后使用 Grapheme_Cluster_Break 规则将字符分组为字素簇。最后颠倒分组顺序。

您需要一份 Unicode 字符数据库的副本才能识别字素簇的边界。这已经占用了相当多的空间,所以你可能想要一个图书馆来做这件事。例如,在 ICU 中,您可能会使用 CharacterIterator(由于它适用于字素簇,而不是 Unicode 所知道的“字符”,因此被误导性命名)。

【讨论】:

  • 听起来是个不错的追求途径 - 但我的天哪,它看起来好过头了。
  • 是的,您当然不想从头开始!但一般来说,有一个图书馆扔它也不算太糟糕。
【解决方案3】:

Text Mechanic 的 Text Generator 似乎在 JavaScript 中执行此操作。我确信在获得作者同意后可以将 JS 翻译成另一种语言(如果您能找到该网站的“联系”链接)。

【讨论】:

  • 它不会反转属性(例如它会生成tͥnę̆rếḟ̴fỉɗ
猜你喜欢
  • 1970-01-01
  • 2022-08-20
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多