„UTF-16” jest uciążliwe określenie, jak to ma dwa znaczenia, które są łatwo pomylić.
Pierwsze znaczenie to seria 16-bitowych punktów kodowych. Większość z nich odpowiada bezpośrednio znakowi Unicode o tej samej liczbie; znaki poza Podstawową płaszczyzną wielojęzyczną (U + 10000 wzwyż) są przechowywane jako dwa 16-bitowe punkty kodowe, każdy z Surrogates.
Wiele języków korzysta z UTF-16 w tym znaczeniu do celów pamięci wewnętrznej, w tym jako natywny typ ciągu. Jest to zwykłe źródło zwrotów takich jak ".NET (lub Java) używa kodowania UTF-16 jako domyślnego kodowania". .NET uzyskuje dostęp do elementów takiego 16-bitowego łańcucha znaków UTF-16 naraz (tj. Na poziomie implementacji, jako uint16).
Następną rzeczą do rozważenia jest kodowanie takiego ciągu znaków UTF-16 w bajtach liniowych, do przechowywania w strumieniu pliku lub sieci. Jak zwykle, gdy przechowujesz większe liczby w bajtach, istnieją dwa możliwe kodowania: little-endian lub big-endian. Możesz więc użyć "UTF-16LE", małego endianowego kodowania UTF-16 w bajtach lub "UTF-16BE", kodowania big-endian.
(częściej używane jest "UTF-16LE", aby dodać więcej zamieszania do ognia, Windows nadaje mu głęboko mylącą i niejednoznaczną nazwę kodowania "Unicode". W rzeczywistości prawie zawsze lepiej jest używać UTF-a 8 dla przechowywania plików i strumieni sieciowych niż jeden z UTF-16LE/BE.)
Ale jeśli nie wiesz, czy garść bajtów zawiera "UTF-16LE" lub "UTF-16BE", możesz użyć Trick spojrzenia na pierwszy punkt kodowy, aby go rozwiązać.Ten punkt kodowy, Byte Order Mark (BOM), jest ważny tylko wtedy, gdy czyta się go w jedną stronę, więc nie można pomylić jednego kodowania z drugim.
Podejście polegające na tym, że nie dbamy o to, jaką masz kolejność bajtów, ale używamy do jej sygnatury zestawienia, zwykle określa się pod nazwą kodowania ... "UTF-16".
Tak więc, gdy ktoś mówi "UTF-16", nie można stwierdzić, czy chodzi o sekwencję krótkich znaków kodu Unicode, czy o sekwencję bajtów w nieokreślonej kolejności, która będzie dekodowana do jednego.
(„UTF-32” ma ten sam problem).
If you don't know what encoding to use when you create a file, don't specify one and .NET will use UTF16
Jeśli to rzeczywisty cytat jest to kłamstwo. Konstruowanie StreamWriter bez argumentu kodowania is explicitly specified, aby uzyskać kodowanie UTF-8.
+1 Wow, dziękuję za tę wspaniałą odpowiedź. Trawię. Gdybym mógł dwa razy głosować, to bym :). –