StringBuilder追加波斯数字

5
我想在一个已经包含波斯字符的字符串后面追加一些数字。使用StringBuilder会使得数字也变成波斯数字并追加到字符串的末尾。
    StringBuilder sb = new StringBuilder();
    sb.Append( other things );
    sb.Append("', '");
    sb.Append("1234234");
    sb.Append("', ");

即使我明确使用英文数字,就像上面的代码,我仍然得到波斯数字。我如何将英文数字附加到此字符串?
更新
这些行模拟了我的问题,您可以通过跟踪此代码来查看波斯数字:
     StringBuilder temp = new StringBuilder();
                    temp.Append("INSERT INTO [db] (....) VALUES ('21211221', 111555, 
                                '2015/12/12', 'نام خانوادگی  ', 'اتاق چهار تخته");
                temp.Append("', '");
                temp.Append("234234");

最后一个附加的应该是英文数字,但它不是。

4
看起来不太可能。但你使用的渲染字符串的方式可能会出现混淆。请发布一个简短但完整的程序来演示问题,并通过显示字符串中每个字符的UTF-16值来诊断字符串的真实内容(基本上将每个“char”强制转换为“int”)。 - Jon Skeet
2
你还没有说你在哪里观察波斯数字。你是将它写入控制台吗?在调试器中看到它?在查看数据库内容的任何工具中看到它?(如果你能将示例缩减到最少,那也会有所帮助。顺便说一句,我强烈建议使用参数化SQL而不是像这样动态构建SQL。) - Jon Skeet
2
是的,我这里无法复现。另外,你可能想考虑在查询中使用参数而不是直接将值放入 SQL 文本中。由于你显然正在使用 varchar 字面量(而不是 nvarchar),所以我不明白 .NET 如何与数据库中的波斯数字有任何关系。 - Luaan
1
你可以在 temp.Append("INSERT.. 后面添加 temp.Append('\x200E'); - Ulugbek Umirov
1
@Akbari 渲染器对RTL和LTR顺序感到困惑。您可以通过指定在波斯字母后使用LTR顺序来帮助它。'U+200E' - 这是Unicode从左到右的符号。 - Ulugbek Umirov
显示剩余12条评论
1个回答

8

正如@Jon-Skeet所说,这是一个渲染器的问题。Windows文本渲染引擎在获取波斯字符后会变得混乱,并继续按从右到左的顺序附加以下文本。因此,我们需要帮助渲染器以正确的从左到右的顺序渲染附加的文本。为此,我们可以在波斯文本之后附加Unicode从左到右符号“U+200E”。

StringBuilder temp = new StringBuilder();
temp.Append("INSERT INTO [db] (....) VALUES ('21211221', 111555, '2015/12/12', 'نام خانوادگی  ', 'اتاق چهار تخته");
temp.Append('\x200E');
temp.Append("', '");
temp.Append("234234");

没有从左到右的符号:

INSERT INTO [db] (....) VALUES ('21211221', 111555, '2015/12/12', 'نام خانوادگی ', 'اتاق چهار تخته', '234234

使用LTR符号:

INSERT INTO [db] (....) VALUES ('21211221', 111555, '2015/12/12', 'نام خانوادگی ', 'اتاق چهار تخته‎', '234234

但这不仅仅是一个渲染问题,这些数字也会以那种方式保存在数据库中。 - Akbari
6
由于字段被重新排序,需要在编辑中比较两个输出结果。最好使用参数化查询,以避免从一开始就出现这样的问题。 - Ulugbek Umirov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接