如何确定字符的ASCII码

彼得

成员
已加入
2019年1月29日
留言内容
8
地点
苏格兰
编程经验
10+
不太确定问题是否完全正确,但是我在字符串中有一个“非打印”字符。如果我在EXCEL中查看字符串,则确定该字符的数字等效值为160(code(mychar))。

在C#中似乎无法使用160(Visual Studio)
同样,像这样的语句似乎并不能隔离字符

C#:
Regex.Replace(line, @"\s+", "^");                    
line = Regex.Replace(line, @"\s+", "^");
Regex.Replace(line, @"\p{Z}", "^");
line = Regex.Replace(line, @"\p{Z}", "^");

当我知道位置时,我设法通过采用字符串的第一个字符将字符隔离为单个字符。
如果然后尝试将其“强制转换”为整数,则会得到65533的值。因此,现在使用以下代码进行反向操作并最终成功,并在字符串中看到“ ^”字符。


C#:
char mychar = (char)65533;        
line = line.Replace(mychar, '^');

但是....这是什么代码,为什么Regex不将其选为空白?
 
Last edited:

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
似乎有些混淆,字符160是不间断的空格,它确实与正则表达式\ s相匹配。它还将与数值160进行相互转换。

65533(十六进制FFFD)是编码中未知值的替换字符,通常会看到<?>以错误的编码读取文本时的符号。
 

彼得

成员
已加入
2019年1月29日
留言内容
8
地点
苏格兰
编程经验
10+
一个不间断的空间

约翰,
非常感谢您的快速回复。

似乎有些混淆,字符160是不间断的空格,它确实与正则表达式\ s相匹配。它还将与数值160进行相互转换。

65533(十六进制FFFD)是编码中未知值的替换字符,通常会看到<?>以错误的编码读取文本时的符号。

看起来像吗?日期:?31/12/2018(在发布之前显示为黑色钻石中的白色问号)
数据是从知名银行组织(在英国/欧洲)输出的文本文件

显然,现在我知道它可以删除了,但感到困惑

您声明字符160为不间断空格-因此可以期望使用\ s将其删除为空白。是否有其他正则表达式的组合可以删除/替换这样的字符。

我该如何最好地解决这样一个角色?

再次感谢
 
Last edited:

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
\ s适合nbsp(160)或\ xa0专门查找该字符,但是由于可以匹配65533,因此问题似乎是您正在读取文本文件且编码错误,并在文本中获取替换字符。
 

彼得

成员
已加入
2019年1月29日
留言内容
8
地点
苏格兰
编程经验
10+
一个不间断的空间

\ s适合nbsp(160)或\ xa0专门查找该字符,但是由于可以匹配65533,因此问题似乎是您正在读取文本文件且编码错误,并在文本中获取替换字符。

再次非常感谢,但是我应该如何正确读取文件以及如何知道如何读取文件。
我用下面的代码用streamreader读取了文件。
C#:
        OpenFileDialog myNewFileDialog = new OpenFileDialog();              
            myNewFileDialog.InitialDirectory = "E:\\MyFiles";                // where to start from
            myNewFileDialog.FileName = "To_31_Dec_2018_TextFile.txt";       // file  name default 
            myNewFileDialog.Filter = "txt files (*.txt)|*.txt";                // optional filter
            myNewFileDialog.ShowDialog();
            string myFname = myNewFileDialog.FileName;
            using (StreamReader sr = File.OpenText(myFname))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                   line = line.Replace(": ", "");
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
File.OpenText"打开现有的UTF-8编码文本文件以进行读取"。如果该文件不是UTF8,则应首先确定它的编码方式。有时您可以尝试Encoding.Default(系统的活动代码页),否则,您需要知道要使用哪种编码。 File.ReadAllText / ReadAllLines可用于读取具有给定编码的文本文件。
 

彼得

成员
已加入
2019年1月29日
留言内容
8
地点
苏格兰
编程经验
10+
一个不间断的空间

File.OpenText "打开现有的UTF-8编码文本文件以进行读取"。如果该文件不是UTF8,则应首先确定它的编码方式。有时您可以尝试Encoding.Default(系统的活动代码页),否则,您需要知道要使用哪种编码。 File.ReadAllText / ReadAllLines可用于读取具有给定编码的文本文件。

非常感谢-我将使用此选项进行“播放”。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
还可以提到某些Unicode文件具有BOM(字节顺序标记),StreamReader可以选择检测此文件并以正确的编码读取此类文件。
 
最佳 底部