提问人:Hagay Gur 提问时间:9/3/2019 最后编辑:GSergHagay Gur 更新时间:8/22/2022 访问量:352
当字符串以与方向无关的字符(例如括号)结尾时解析 rtl 语言的问题
Problems with parsing rtl languages when a string ends with a direction agnostic character (eg. brackets)
问:
当从MySsql服务器接收以与方向无关的字符结尾的RTL字符串时,字符串数组中的第一个char()将切换为结束字符,如以下示例所示(希望此处以正确的顺序呈现):string[0]
String str = "קוד (לדוגמה)";
Char a = str[0];
Char b = str[1];
在此示例中,=( 和 =ק,这是不正确的。 should = ק 和 should = ו。a
b
a
b
使用子字符串进行字符提取会产生相同的结果。
经过进一步的检查,我了解到 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 工作台,如何知道是将括号放在开头还是结尾?
答:
经过大量检查,使用 unicode 时,似乎有一个常见的约定是将最后一个字符存储为第一个字符,反之亦然,如果它是 RTL 字符串中的 LTR\单向字符。 文本解析器之间的约定似乎略有不同,这在浏览器之间很明显。但是,在我们的例子中,第一个字符确实是括号。如果它是第一个角色,它最终将成为最后一个角色。 我建议只检查你自己的特定存储、解析器和库的处理情况。
下一个:RX:如何等待订阅者完成?
评论
(
)
(
str[0] == '('
05E7 05D5 05D3 0020 0028 05DC 05D3 05D5 05D2 05DE 05D4 0029
a = str[0] = '('