gpt4 book ai didi

用于将 Visual LTR 转换为逻辑 RTL 的 C# 算法

转载 作者:行者123 更新时间:2023-11-30 18:23:26 28 4
gpt4 key购买 nike

我正在使用 C# 脚本在 Unity3d 中开发一个项目,其中的字符串以希伯来语和英语编写。Unity3d 的问题是在编写 UI 文本时不支持 RTL 语言(如希伯来语)。

问题是这样的:原文:מעכת העטלף הינה מערכת, אש מתבססת על טכנולוגית ה- GPR(探地雷达)- 丹麦文

统一:GPR -‹ תיגולונכט לע תססבתמ רשא ,תכרעמ הניה ףלטעה תכרעמ.עקוק רדוח ראדאר -(探地雷达)

我试图破解文本打印到文本框的顺序已有一个月了,但我无法做到恰到好处。我编写了以下函数:

    public string CorrectText (string text)
{
string result = "";
string temp = "";
string charListString = "";
List<Char> charList = new List<char> ();
char[] charArray = text.ToCharArray ();

Array.Reverse (charArray);

//go through each char in charArray
for (int x = 0; x <= charArray.Length -1; x++) {
//if the current char we're examing isn't a Space char -
if (!char.IsWhiteSpace (charArray [x])) {
//add it to charList
charList.Add (charArray [x]);
} else { //if the current char we're examing is a Space char -
charListString = new string (charList.ToArray ());

//if charListString doesn't contains English or Numeric chars -
if (!Regex.IsMatch (charListString, "^[0-9a-zA-Z.,()-]*$")) {
//go through each char in charList
for (int y = 0; y <= charList.Count - 1; y++) {
//add the current char to temp as is (not flipped)
temp += charList [y];
}

//add temp to result
if (x < charArray.Length - 1)
result += temp + " ";
if (x == charArray.Length - 1)
result += temp;

//clear charList and temp
charList.Clear ();
temp = "";
} else { //if temp contains English or Numeric chars -
//go through each char in charList - This flipps the order of letters
for (int y = charList.Count - 1; y >= 0; y--) {
//add the current char to temp
temp += charList [y];
}

//add temp to result
if (x < charArray.Length - 1)
result += temp + " ";
if (x == charArray.Length - 1)
result += temp;
//clear charList and temp
charList.Clear ();
temp = "";
}
}

}

return result;
}

这几乎解决了问题,但是文本是从下往上写的,例如:

输入:מעכת העטלף הינה מערכת, אש מתבססת על טכנולוגית ה- GPR(探地雷达)- 丹麦文

输出:(探地雷达)- 丹麦语。מעכת העטלף הינה מערכת, אש מתבססת על טכנולוגית ה- GPR

有时括号会混在句子中,如下所示:)Ground Penetrating( 雷达 - 丹麦文

我在网上找到了一个工具,可以将 Visual Hebrew 转换为 Logic Hebrew,当我将翻转的文本复制到 unity 时,它就像变魔术一样有效!

但我无法在网上找到任何有用的信息,了解如何使用 C# 制作我自己的脚本来做同样的事情。

最佳答案

我设法克服了这个......有点:

  1. 将字符串分配给文本元素。
  2. 使用 Canvas.ForceUpdateCanvases() 或其他方式强制更新 Canvas 。
  3. 获取文本组件的缓存文本生成器(不适用于布局)。如果您不强制更新或屈服并等待下一帧,它将对您撒谎;所以不要跳过第 2 步。
  4. 使用缓存文本生成器的getLines获取文本换行信息;它包含每一行开始的索引。
  5. 取这些值的最大差异,在换行前每行的字符数可能是多少。
  6. 翻转字符之前,使用您在上一步中找到的行长度手动将“\n”(新行)插入原始字符串!
  7. 对包裹的字符串进行反转处理。如果你以不同的顺序做这些事情,你最终会得到最短的第一行,而不是最后一行。所以先包起来,再倒过来。
  8. 将字符串设置为文本组件,它应该可以工作。通常。

关于用于将 Visual LTR 转换为逻辑 RTL 的 C# 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297691/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com