Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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# 如何正确地将字符代码大于127的字符串转换为字节数组?_C#_.net_Character Encoding_Ascii - Fatal编程技术网

C# 如何正确地将字符代码大于127的字符串转换为字节数组?

C# 如何正确地将字符代码大于127的字符串转换为字节数组?,c#,.net,character-encoding,ascii,C#,.net,Character Encoding,Ascii,我正在从另一个系统检索使用代码页437编码的ASCII字符串,我需要将其转换为Unicode,以便它们可以与其他Unicode字符串混合 这就是我正在处理的问题: var asciiString = "\u0094"; // 94 corresponds represents 'ö' in code page 437. var asciiEncoding = Encoding.GetEncoding(437); var unicodeEncoding = Encoding.Unicode;

我正在从另一个系统检索使用代码页437编码的ASCII字符串,我需要将其转换为Unicode,以便它们可以与其他Unicode字符串混合

这就是我正在处理的问题:

var asciiString = "\u0094"; // 94 corresponds represents 'ö' in code page 437.

var asciiEncoding = Encoding.GetEncoding(437);
var unicodeEncoding = Encoding.Unicode;

// This is what I attempted to do but it seems not to be able to support the eight bit. Characters using the eight bit are replaced with '?' (0x3F)
var asciiBytes = asciiEncoding.GetBytes(asciiString);

// This work-around does the job, but there must be built in functionality to do this?
//var asciiBytes = asciiString.Select(c => (byte)c).ToArray();

// This piece of code happliy converts the character correctly to unicode { 0x94 } => { 0xF6, 0x0 } .
var unicodeBytes = Encoding.Convert(asciiEncoding, unicodeEncoding, asciiBytes);
var unicodeString = unicodeEncoding.GetString(unicodeBytes); // I want this to be 'ö'.
我正在努力解决的是,我无法在.NET framework中找到合适的方法将字符代码大于127的字符串转换为字节数组。这似乎很奇怪,因为有人支持将127以上字符的字节数组转换为Unicode字符串

所以我的问题是,是否有任何内置的方法来正确地进行转换,或者我的工作是否围绕着正确的方法进行呢

var asciiString = "\u0094";
不管你叫它什么,它总是一个字符串。NET只有Unicode字符串


我正在从另一个系统检索用代码页437编码的ASCII字符串

将传入数据视为
字节[]
,而不是
字符串

var asciiBytes = new byte[] { 0x94 }; // 94 corresponds represents 'ö' in code page 437.

var asciiEncoding = Encoding.GetEncoding(437);    

var unicodeString = asciiEncoding.GetString(asciiBytes);

您必须查看代码的前面部分。一旦您将数据作为字符串,它就已经被解码了。解码过程中丢失的任何字符都不可能恢复

您需要以字节形式输入,以便可以使用代码页437的编码对象将其解码为字符串

byte[] asciiData = new byte[] { 0x94 }; // character ö in codepage 437

Encoding asciiEncoding = Encoding.GetEncoding(437);

string unicodeString = asciiEncoding.GetString(asciiData);

Console.WriteLine(unicodeString);
输出:

ö
\u0094
是Unicode代码点0094,它是一个控制字符;它不是
ö
。如果需要
ö
,则正确的字符串为

string s = "ö";
这是带分音符的拉丁文小写字母O,又名代码点00F6

因此:

现在我们得到我们的编码:

var enc = Encoding.GetEncoding(437);
var bytes = enc.GetBytes(s);
我们发现它是一个单字节的十进制148,也就是十六进制94,也就是你要找的


这里的意义在于,在C#中,当您使用
“\uxxx”
语法时,XXXX总是指的是Unicode代码点,而不是某些特定编码中的编码值。

感谢您的澄清。在我的例子中,传入的数据实际上是数据类型字符串(不是我的选择),因此我必须首先将其转换为字节数组,以便对其进行处理,可能最好是按照我的方式进行处理。@OskarSjöberg that。。。相反;您当前的方法基于一个错误的前提,即
“\u0094”
在某种程度上与
有关,这是不正确的。@OskarSjöberg这表明您读取的传入数据不正确,编码错误。如果您以一个包含0x94的字符串开始,并且该字符串表示ö,那么听起来好像编码是反向使用的(这是不合法的)。将字符串转换为字节数组就是编码。在我看来,这里真正的问题似乎是在最初的解码过程中提前了一步,即字符串的来源。@Oskar确实,ASCII是0-127,但您对代码页437的看法不正确-它确实支持更高的字符:我在回答中给出了一个例子。问题是,十六进制-94不是你想象中的字符。@OskarSjöberg:字符
没有字符代码
0x94
它是
0x3f
;只是一个普通的问号。您的字符串不再包含原始信息,因为它已使用错误的编码进行解码,因此无法以任何方式将其转换以获取信息。你需要改变解码,而不是试图扭转已经造成的损害。我的代码只是一个例子。我从Web服务中检索一个字符串(我无法控制),并从437代码页中获取所有字符的字符串。一个例子是\u0094。我需要将其转换为“ö”。@Oskar确认错误在上游。没有包含来自codepage X的字符的.net字符串。所有的.net字符串始终是utf-16代码点。您正在反向运行此转换。web服务应该是固定的。。。或者执行“从中检索字符串”位的代码就是错误所在。“我正在检索用代码页437编码的ASCII字符串”。如果它是代码页437,那么它不是ASCII,反之亦然。ASCII是代码页20127。感谢您澄清ASCII和代码页之间的区别。
var enc = Encoding.GetEncoding(437);
var bytes = enc.GetBytes(s);