替换从Excel读取的字符串中的特定Unicode字符

5

我试图替换从Excel电子表格中检索到的字符串中的一些不良字符。原因是我们的Oracle数据库使用WE8ISO8859P1字符集,该字符集未定义文本中Excel“贴心”插入的几个字符(弯引号、em和en破折号等)。由于我无法控制数据库或Excel电子表格的创建方式,因此需要用其他内容替换这些字符。

我这样将单元格内容检索到一个字符串中:

string s = xlRange.get_Range("A1", Missing.Value).Value2.ToString().Trim();

在Visual Studio的文本可视化器中查看字符串,可以看到完整且正确地检索到了文本。接下来,我尝试替换其中一个不良字符(在这种情况下是右花括号引号符号):
s = Regex.Replace(s, "\u0094", "\u0022");

但它并没有起到任何作用(文本可视化器显示它仍然存在)。为了尝试验证我想要替换的字符是否实际存在于其中,我尝试了:

bool a = s.Contains("\u0094");

但它返回false。然而:
bool b = s.Contains("”");

返回真。

我对.NET中的字符串有一些了解,它们是使用UTF-16编码的,而Excel可能会使用ANSI。那么这是否意味着我需要更改从Excel导出的文本的编码方式?或者我在这里做错了什么?任何建议都将不胜感激。我已经阅读并反复阅读了所有关于Unicode和编码的文章,但仍然一无所知。

2个回答

4

是的,.Net中的字符串是UTF-16格式的。

你做得很好,也许你的十六进制计算有误。你测试的字符不是"\u0094"(不确定这是否是你的意思)。以下代码对我有效:

((int)"”"[0]).ToString("X")返回"201D"

"”" == "\u201D"返回true

"\u0094" == ""(右侧为空字符串)返回false

许多UTF-16字符在文本可视化器中看起来像空字符串,但它们可能是无法显示的字符或代理的一部分(即,某些字符可能需要键入"\UXXXXXXXX",而其他字符可以使用(四位数)"\uXXXX")。我对这个领域的了解非常有限。

参考资料 - Jon Skeet的文章:


是的,你说得对,我的十六进制数值完全偏离了。原来我使用的是WIN1252字符集的代码点,而不是UTF-16。总有一天我会理解所有这些(届时它将被更加复杂且难以理解的东西所取代)。感谢你的回答。 - Sid Holland

2
你可以使用NVARCHAR和NTEXT代替VARCHAR和TEXT,以便为需要容纳这些字符的列提供更好的支持。这样你就不必转换整个数据库,并且将来还可以保证列是Unicode编码。

是的,那将是理想的,但不幸的是我无法控制数据库。 - Sid Holland

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