将短数组转换为字符串 C#

8

是否可以将short数组转换为string,然后显示文本?

short[] a = new short[] {0x33, 0x65, 0x66, 0xE62, 0xE63};

数组中包含有泰文字符的utf16编码。如何输出并显示泰文和英文单词?

谢谢。


4
你是否必须以 short 数组开始?如果你可以用 char 数组代替(每个 char 是一个 16 位无符号整数),那么它会简单得多... - Jon Skeet
5个回答

10
您可以使用以下方法从UTF16字节数组获取字符串:
System.Text.Encoding.Unicode.GetString(bytes)

然而,这个只接受字节数组。因此你必须先将你的 shorts 转换为 bytes:

var bytes = a.SelectMany(x => BitConverter.GetBytes(x)).ToArray();

或者稍微冗长但更高效的代码:

var bytes = new byte[a.Length * 2];
Buffer.BlockCopy(a, 0, bytes, 0, a.Length * 2);

我会使用Buffer.BlockCopy将其转换为字节数组。 - MrMoDoJoJr

7
我有点借鉴了其他人的答案,但这是一种更加简洁的方式来实现相同的功能:
short[] shorts = new short[] { 0x33, 0x65, 0x66, 0xE62, 0xE63 };
char[] chars = Array.ConvertAll(shorts, Convert.ToChar);
string result = new string(chars);

3

试试这个:

//short[] a = new short[] {0x33, 0x65, 0x66, 0xE62, 0xE63};
char[] a = new char[] {0x33, 0x65, 0x66, 0xE62, 0xE63};
string s = new string(a);

Console.WriteLine(s);

这不是将short[]转换为字符串...它是将short[]的代码重写为char[],然后将其转换为字符串。 - Sepster
1
@Sepster:提问者想要一个字符串,虽然他们说他们需要一个short[],但他们可能没有意识到char支持UTF-16。 - Guvante
1
@Guvante提出的问题是:“是否可以将short数组转换为字符串?”并不是说答案没有用处(这也是我为什么没有给它点踩),但从现在的情况来看,它并没有回答“问题”。 - Sepster
@Sepster:但是如果Fusionmate没有真正使用“short”的理由,这确实解决了他的问题... - Guvante
2
@Guvante 我并不反对。只是建议回答至少需要一些限定条件,以防他没有使用“short”的真正理由。 :-) - Sepster

1
你需要一个字符数组charstring有一个直接接受一个字符数组的重载。
char[] temp = new char[a.Length];
Array.Copy(a, temp, a.Length);
return new string(temp);

很不幸,这需要复制整个数组。你理论上可以通过使用一些转换技巧和不安全代码来避免这种情况,但这将是棘手的。
理想情况下,正如其他人所提到的,你应该从一个char[]开始,而不是一个short[]。例如,如果你正在从文件中加载数据,那么在转换后,你可以将找到的数字存储到一个char[]中。

0

试一下这个:

short[] a = new short[] { 0x33, 0x65, 0x66, 0xE62, 0xE63 };
var contobyte = a.Select(b => (byte)b).ToArray();
var res = System.Text.Encoding.Unicode.GetString(contobyte);

UTF8不可行,因为OP说数组中有UTF16字符。 - itsme86

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