Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 替换从Excel读取的字符串中的特定Unicode字符_C#_Unicode_Encoding - Fatal编程技术网

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

C# 替换从Excel读取的字符串中的特定Unicode字符,c#,unicode,encoding,C#,Unicode,Encoding,我试图替换从Excel电子表格检索到的字符串中的一些不需要的字符。原因是我们的Oracle数据库使用的是WE8ISO8859P1字符集,该字符集没有定义Excel在文本中“有用”插入的几个字符(卷曲引号、em和en破折号等)由于我无法控制数据库或Excel电子表格的创建方式,因此我需要用其他字符替换字符 我将单元格内容检索为字符串,因此: string s = xlRange.get_Range("A1", Missing.Value).Value2.ToString().Trim(); 在V

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

我将单元格内容检索为字符串,因此:

string s = xlRange.get_Range("A1", Missing.Value).Value2.ToString().Trim();
在VisualStudio的文本可视化器中查看字符串将显示要完成并正确检索的文本。接下来,我尝试替换其中一个不需要的字符(在本例中为右侧的卷曲引号符号):

但它什么也不做(文本可视化器显示它仍然存在)。为了尝试验证我要替换的角色是否确实在其中,我尝试了以下操作:

bool a = s.Contains("\u0094");
但它返回false。然而:

bool b = s.Contains("”");
返回true

我(有点缺乏)对.NET中字符串的理解是,它们是用UTF-16编码的,而Excel可能会使用ANSI。那么,这是否意味着我需要更改从Excel中输出的文本的编码?还是我做错了什么?如有任何建议,将不胜感激。我已经阅读并重读了所有关于Unicode和编码的文章,但仍然没有一篇更明智。

是的,.Net中的字符串是

你做得对;也许你的十六进制数学是错误的。 您测试的字符不是
“\u0094”
(不确定您的意思)。以下几点对我很有用:

((int)“”[0])。ToString(“X”)
返回
“201D”

“”“==”\u201D“
返回
true

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

许多UTF-16字符在文本可视化工具中看起来是空字符串,但它们可以是不可扩展的字符,也可以是代理项的一部分(即,某些字符可能需要键入
“\uxxxxxxx”
,而其他字符则可以使用(四位数)
“\uXXXX”
)。我对这个领域的知识非常有限

参考-的文章关于:



对于需要容纳这些字符的列,可以使用NVARCHAR和NTEXT而不是VARCHAR和TEXT。
这样,您就不必转换整个数据库,而且您是经得起未来考验的,因为列将是Unicode。

是的,您说得很对,我的十六进制值太离谱了。事实证明,我使用的是WIN1252字符集的代码点,而不是UTF-16。总有一天我会明白这一切(在此基础上,它将被更复杂、更难以理解的东西所取代)。谢谢你的回答。是的,那将是理想的,但遗憾的是我无法控制数据库。@Sidhland这里有什么帮助吗?:)
bool b = s.Contains("”");