Câu hỏi UTF-16 chuỗi terminator


Chuỗi chuỗi terminator cho chuỗi UTF-16 là gì?

CHỈNH SỬA:

Hãy để tôi thuật lại câu hỏi trong một nỗ lực để làm rõ. Cuộc gọi đến wcslen() công việc?


12
2018-05-07 20:55


gốc


1 Bất kể thực tế là nó sẽ sollicit "câu hỏi sai" loại câu trả lời, tôi thích câu hỏi kiểu này bởi vì nó chỉ là điều mà google cũng không wikipedia sẽ cho bạn biết. - sehe
Có lẽ vì nó quá rõ ràng. :-) BTW, C không cho phép UTF-16 làm mã hóa cho wchar_tvà không thể đơn giản vì nó không hoạt động với API C cho các ký tự rộng, giả định mỗi ký tự nhiều byte tương ứng với một Độc thân  wchar_t giá trị, không phải là chuỗi wchar_t giá trị. Bạn đang mắc kẹt với UCS-2 hoặc các hàm chuẩn không tuân thủ các yêu cầu của tiêu chuẩn nếu bạn khăng khăng thực hiện wchar_t 16-bit ... - R..
Trên mọi hệ thống tôi đã từng sử dụng, sizeof(wchar_t) == 4 byte hoặc 32 bit. Tôi không nghĩ rằng nó sẽ hoạt động khác. - tchrist
Microsoft Visual C ++ có sizeof(wchar_t) == 2, gây phiền toái cho các lập trình viên cần viết các thư viện đa nền tảng hỗ trợ Unicode. - dan04


Các câu trả lời:


Unicode không xác định các thuật ngữ chuỗi. Môi trường hoặc ngôn ngữ của bạn. Ví dụ, các chuỗi C sử dụng 0x0 như một terminator chuỗi, trong đó các ngôn ngữ .NET không sử dụng một terminator chuỗi nào cả - chúng định nghĩa một giá trị riêng biệt trong String lớp để lưu trữ độ dài của chuỗi.

Để trả lời câu hỏi thứ hai của bạn, wcslen tìm kiếm một chấm dứt L'\0' tính cách. Mà như tôi đọc nó, là bất kỳ độ dài nào của 0x00 byte, tùy thuộc vào trình biên dịch, nhưng có thể sẽ là chuỗi hai byte 0x00  0x00 nếu bạn đang sử dụng UTF-16 (mã hóa U + 0000, 'NUL')


13
2018-05-07 20:57



Điểm nhỏ của câu đố - .NET String đối tượng có độ dài và một terminator null trong nội bộ. Điều đó cho phép chúng được sử dụng trực tiếp bởi các chức năng interop mà mong đợi một terminator. - Jon Skeet
@ Jon: không có ý tưởng, cảm ơn. Tôi cho rằng tôi sẽ không tìm thấy người kết thúc nếu tôi đi săn Chars? - Michael Petrotta
... tất nhiên là tôi không có quyền truy cập trực tiếp vào ToCharArray có thể làm bất cứ điều gì nó muốn, bao gồm khả năng một số phép thuật bản địa. - Michael Petrotta
Đó là chuỗi byte 0x00 0x00, phải không? - Ray
@Ray: đó là sự thật, nếu môi trường của bạn sử dụng UTF-16. Quan điểm của tôi là một nhân vật rộng, được sử dụng bởi wcslen, không có độ dài được xác định. Bạn được tự do sử dụng (một trang điểm) UTF-128, và sau đó wcslen sẽ tìm kiếm một chuỗi 16 0x00 byte. - Michael Petrotta


Không có gì cả. Chuỗi terminators không phải là một phần của một mã hóa.

Ví dụ: nếu bạn có chuỗi ab nó sẽ được mã hóa bằng UTF-16 với chuỗi byte sau: 61 00 62 00. Và nếu bạn có 大家 bạn sẽ nhận được 27-59-B6-5B. Vì vậy, như bạn có thể thấy không có trình tự terminator được xác định trước.


4
2018-05-07 20:57





7.24.4.6.1 Hàm wcslen (từ chuẩn mực)

...

   [#3]   The  wcslen  function  returns  the  number  of  wide
   characters that precede the terminating null wide character.

Và ký tự trống rộng là L'\0'


4
2018-05-07 21:26



wchar_t null = L'\0'; printf("null is %d bits\n", 8 * sizeof null); in ra rằng null là 32 bit. - tchrist
@ tchrist: bạn nên sử dụng CHAR_BITthay vì phép thuật 8. Điều đó null có cùng kích thước với mỗi phần tử (4) của mảng L"foo". - pmg
Cảm ơn, tôi không biết điều đó. - tchrist