2013-04-04 79 views
7

Có thể chuyển đổi short mảng thành string, sau đó hiển thị văn bản không?Chuyển đổi mảng ngắn thành chuỗi C#

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

utf16 (ký tự tiếng Thái) chứa trong mảng. Làm thế nào nó có thể xuất và hiển thị các từ tiếng Thái và tiếng Anh?

Cảm ơn bạn.

+3

Bạn có * phải * để bắt đầu với một 'mảng short'? Nếu bạn có thể bắt đầu với một mảng 'char' thay thế (mỗi' char' là một số nguyên không dấu 16 bit) thì nó sẽ đơn giản hơn nhiều ... –

Trả lời

3

Hãy thử điều này:

//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); 
+0

Đây không phải là chuyển đổi một [] ngắn thành một chuỗi ... nó _re-viết code_ cho ngắn [] như char [] và sau đó chuyển đổi _that_ thành một chuỗi. – Sepster

+1

@Sepster: Người hỏi muốn một chuỗi, trong khi họ nói rằng họ cần một [] ngắn, họ có thể không nhận ra rằng char hỗ trợ UTF-16. – Guvante

+1

@Guvante "Có thể chuyển đổi mảng ngắn thành chuỗi" là câu hỏi hay không. Không đồng ý rằng câu trả lời là hữu ích ... (đó là lý do tại sao tôi đã không downvoted), nhưng khi nó ngồi, nó không trả lời _the question_. – Sepster

10

Bạn có thể nhận được một chuỗi từ một mảng byte UTF16 sử dụng phương pháp này:

System.Text.Encoding.Unicode.GetString(bytes) 

Tuy nhiên, điều này chỉ chấp nhận một mảng byte. Vì vậy, trước tiên bạn phải chuyển quần short của bạn để byte:

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

Hoặc hơi dài dòng hơn, nhưng nhiều mã hiệu quả hơn:

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

Tôi đã chuyển đổi thành một mảng byte bằng cách sử dụng Buffer.BlockCopy – MrMoDoJoJr

+0

Điểm tốt MrMoDoJoJr, tôi đã chỉnh sửa bài đăng của mình. – JustAnotherUserYouMayKnow

0

thử điều này:

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); 
+0

UTF8 sẽ không hoạt động vì OP cho biết có các ký tự UTF16 trong mảng. – itsme86

+0

Và sử dụng mã của bạn, bạn sẽ nhận được một danh sách các chuỗi chứ không phải một chuỗi. – JustAnotherUserYouMayKnow

1

Bạn cần một mảng của char. string có quá tải chấp nhận trực tiếp.

char[] temp = new char[a.Length]; 
Array.Copy(a, temp, a.Length); 
return new string(temp); 

Thật không may điều này liên quan đến việc sao chép toàn bộ mảng. Bạn về mặt lý thuyết có thể tránh điều này bằng cách sử dụng một số thủ đoạn đúc và mã không an toàn, nhưng nó sẽ là khó khăn.

Lý tưởng nhất là những người khác đã đề cập, bạn sẽ bắt đầu với một số char[] thay vì short[]. Ví dụ: nếu bạn đang tải từ một tệp, bạn có thể lưu trữ các số bạn tìm thấy vào một số char[] sau khi truyền chúng.

4

Tôi hơi xé toạc câu trả lời của những người khác, nhưng đây là một cách sạch hơn làm điều tương tự:

short[] shorts = new short[] { 0x33, 0x65, 0x66, 0xE62, 0xE63 }; 
char[] chars = Array.ConvertAll(shorts, Convert.ToChar); 
string result = new string(chars); 
Các vấn đề liên quan