当字符串以与方向无关的字符(例如括号)结尾时解析 rtl 语言的问题

Problems with parsing rtl languages when a string ends with a direction agnostic character (eg. brackets)

提问人:Hagay Gur 提问时间:9/3/2019 最后编辑:GSergHagay Gur 更新时间:8/22/2022 访问量:352

问:

当从MySsql服务器接收以与方向无关的字符结尾的RTL字符串时,字符串数组中的第一个char()将切换为结束字符,如以下示例所示(希望此处以正确的顺序呈现):string[0]

String str = "קוד (לדוגמה)";
Char a = str[0];
Char b = str[1];

在此示例中,=( 和 =ק,这是不正确的。 should = ק 和 should = ו。abab

使用子字符串进行字符提取会产生相同的结果。 经过进一步的检查,我了解到 RTL 字符串在大多数编程语言的幕后都保留为 LTR。使用 Unicode RTL 符号不会改变结果。
这给我们带来了一个独特的问题,因为在我们的 ETL 过程中,它需要遍历所有字符(而不是搜索,因为看起来正则表达式可以处理这个用例),我们无法区分第一个字符是否确实是括号或其他符号,或者它是结束字符。 关于如何解决这个问题的任何想法将不胜感激,因为到目前为止,我们找不到与我们的案件相关的答案。

编辑:
示例代码似乎与我们在使用某些浏览器显示时遇到的问题相同。
括号实际上位于字符串的末尾。
正确顺序: https://files.logoscdn.com/v1/files/35323612/content.png?signature=pvAgUwSaLB8WGf8u868Cv1eOqiM
错误,在某些浏览器上的堆栈溢出显示时也会发生: https://files.logoscdn.com/v1/files/35323580/content.png?signature=LNasMBU9NWEi_x3BeVSLG9FU5co

第二次编辑:
检查MySql二进制文件后,MySql中的字符串似乎以括号开头。但是,我不确定这是否是正确的存储方式,因为我们使用的每个可能的显示器(包括但不限于 Visual Studio)都正确显示它,并且除了字符操作之外,字符串的作用就好像括号在末尾一样。
因此,更好地表达这个问题:所有这些系统,包括用 C# AFAIK 编写的 MySql 工作台,如何知道是将括号放在开头还是结尾?

C# mysql unicode 语言无关, 从右到左

评论

2赞 Bradley Grainger 9/3/2019
如您所知,Unicode 字符串以“逻辑”顺序存储,并且仅切换到 RTL 顺序进行显示。Unicode 双向算法 unicode.org/reports/tr9 非常复杂,但确实指定仅当括号字符位于 RTL 字符串中时才会反转以显示。也就是说,将显示为 C# 中的字符,但仍是 C# 中的字符。你已经在你的例子中表明了这一点,所以我不明白为什么你“无法区分第一个字符是否确实是括号”;中方能否介绍具体情况?()(str[0] == '('
0赞 Hagay Gur 9/3/2019
由于字符串也可以是 LTR,因此无法正确确定支架位置。不幸的是,它也可以被逆转,因为我无法控制这种情况下的输入字符串,并且正在处理大量数据,这些数据可能会变化到非常大的数量。
0赞 Bradley Grainger 9/3/2019
“括号位置”是什么意思?它应该位于字符串中的索引 0 处。您是在谈论它在 RTL 或 LTR 显示屏幕上的显示位置吗?如果是这样,那就是另一个问题,Unicode 双向算法适用。你到底想确定什么?
0赞 Hagay Gur 9/4/2019
显然,您在浏览器中的显示与我们在代码中的显示存在相同的问题。括号实际上写在最后一个位置 [11],但是,它被移到了第一个位置 [0]。添加图片以澄清。编辑:由于代表性低,无法添加图片。括号只括在第二个单词的周围,而不是在开头。
0赞 Bradley Grainger 9/4/2019
如果您列出代码点的实际内容,可能会有所帮助。如果“括号只包围第二个单词”,那会让我认为你的字符串是.但是,您也写了这显然不是真的。除非您说从MySQL Server检索此数据的行为会更改代码单元顺序?顺便说一句,您可以将图像发布到 imgur 并在此处粘贴链接。05E7 05D5 05D3 0020 0028 05DC 05D3 05D5 05D2 05DE 05D4 0029a = str[0] = '('

答:

0赞 Hagay Gur 9/4/2019 #1

经过大量检查,使用 unicode 时,似乎有一个常见的约定是将最后一个字符存储为第一个字符,反之亦然,如果它是 RTL 字符串中的 LTR\单向字符。 文本解析器之间的约定似乎略有不同,这在浏览器之间很明显。但是,在我们的例子中,第一个字符确实是括号。如果它是第一个角色,它最终将成为最后一个角色。 我建议只检查你自己的特定存储、解析器和库的处理情况。