我正在尝试替换从Excel电子表格中检索到的字符串中的某些不需要的字符。原因是我们的Oracle数据库使用的是WE8ISO8859P1字符集,它没有定义Excel“帮助”在文本中插入的几个字符(引号,em和en破折号等)因为我无法控制数据库或者如何创建Excel电子表格我需要用其他东西替换字符。
我将单元格内容检索为字符串,因此:
string s = xlRange.get_Range("A1", Missing.Value).Value2.ToString().Trim();
在Visual Studio的Text Visualiser中查看字符串会显示要完整并正确检索的文本。接下来,我尝试替换其中一个不需要的字符(在本例中为右侧卷曲引号):
s = Regex.Replace(s, "\u0094", "\u0022");
但它没有做任何事(Text Visualiser显示它仍然存在)。为了尝试验证我想替换的角色实际上在那里,我尝试了:
bool a = s.Contains("\u0094");
但它返回false。但是:
bool b = s.Contains("”");
返回true。
我(有点缺乏)对.NET中字符串的理解是它们是用UTF-16编码的,而Excel可能会使用ANSI。那么这是否意味着我需要更改Excel中出现的文本编码?或者我在这里做错了什么?任何建议将不胜感激。我已经阅读并重新阅读了我能找到的关于Unicode和编码的所有文章,但我仍然没有更聪明。
答案 0 :(得分:4)
.Net中的字符串是UTF-16。
你做得对;也许你的十六进制数学不正确。
您测试的角色不是"\u0094"
(不确定您的意思)。以下对我有用:
((int)"”"[0]).ToString("X")
返回"201D"
"”" == "\u201D"
返回true
"\u0094" == ""
(右侧是空字符串)返回false
许多UTF-16字符在文本可视化工具中看起来像一个空字符串,但它们可以是不可显示的字符或代理项的一部分(即某些字符可能需要键入"\UXXXXXXXX"
而其他字符可能需要输入"\uXXXX"
可以用(四位数){{1}}。)。我对这个领域的了解非常有限。
参考文献 - Jon Skeet的文章:
答案 1 :(得分:2)
对于需要容纳这些字符的列,您可以使用NVARCHAR和NTEXT代替VARCHAR和TEXT。 这样你就不必转换整个数据库,并且你将来会证明,因为这些列将是Unicode。