Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
Volrajas
Заблокирован
1

Чем отличается Encoding.Unicode от Encoding.UTF16

29.10.2015, 08:58. Просмотров 4317. Ответов 15

я вот что то не пойму чем отличается Encoding.Unicode от Encoding.UTF16? и почему в браузерах используется UTF8 хотя там юникод вроде бы... юникод он же 2х байтный, значит UTF16 это и есть юникод разве нет? и еще такой вопрос у меня есть файл в кодировке ANSI, как мне его сделать в кодировке юникод?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2015, 08:58
Ответы с готовыми решениями:

Какую кодировку получаем от преобразования Encoding.Unicode.GetBytes(data)
Коллеги, помогите, кто чем может, сами мы не местные... Есть некоторый клиент, написанный на C#,...

Encoding - Число байт больше чем символов в строке
Доброй ночи! В строке s у меня различные странные символы ,например Ü номер которого 220 в...

Перевод кодировки символов (Encoding)
Привет всем. В общем, такая проблема Была проблема в программе с кириллицей, с не читаемой ее...

Операция обратная Encoding.GetBytes()
string str = "21"; byte send2 = Encoding.ASCII.GetBytes(str); Console.Write(send2); Выводит...

Additional information: 'cp1251' is not a supported encoding name
using System.IO; using System.Net; using System.Text; namespace Testparser { class...

15
veselchack
1 / 1 / 3
Регистрация: 26.10.2015
Сообщений: 25
29.10.2015, 11:10 2
Цитата Сообщение от Volrajas Посмотреть сообщение
у меня есть файл в кодировке ANSI, как мне его сделать в кодировке юникод?
Для смены кодировки используйте текстовый редактор.
Например в стандартном блокноте - Файл - Сохранить как, и внизу диалога сохранения есть выпадающий список с типами кодировки.

Добавлено через 3 минуты
Цитата Сообщение от Volrajas Посмотреть сообщение
чем отличается Encoding.Unicode от Encoding.UTF16
Есть замечательный сайт MSDN. Если поискать там класс Encoding, то можно найти там описание его свойств и методов.

Добавлено через 3 минуты
А еще здесь есть табличка, которая должна тебе помочь
0
Exerion
[Bicycle Reinventor]
320 / 258 / 109
Регистрация: 19.10.2011
Сообщений: 659
Записей в блоге: 2
Завершенные тесты: 2
29.10.2015, 11:15 3
Encoding.Unicode - это UTF-16 little endian.
Сравнительные таблицы юникодов можно посмотреть на вики.
0
Volrajas
Заблокирован
29.10.2015, 11:27  [ТС] 4
Цитата Сообщение от veselchack Посмотреть сообщение
Для смены кодировки используйте текстовый редактор.
Например в стандартном блокноте - Файл - Сохранить как, и внизу диалога сохранения есть выпадающий список с типами кодировки.
нет мне надо чтоб моя программа сама меняла кодировку файла
Цитата Сообщение от veselchack Посмотреть сообщение
Есть замечательный сайт MSDN. Если поискать там класс Encoding, то можно найти там описание его свойств и методов.
"Получает кодировку для формата UTF-16 с прямым порядком байтов." то бишь это эквивалент UTF-16 или все таки есть отличия?
Цитата Сообщение от veselchack Посмотреть сообщение
А еще здесь есть табличка, которая должна тебе помочь
тут не указан Encoding.Unicode
Цитата Сообщение от Exerion Посмотреть сообщение
Encoding.Unicode - это UTF-16 little endian.
я не знаю что такое little endian, так разница какая то между ними есть?
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9691 / 4067
Регистрация: 17.03.2014
Сообщений: 19,339
Записей в блоге: 1
Завершенные тесты: 2
29.10.2015, 11:36 5
Volrajas, юникод это многобайтовая кодировка в рамках которой определены схемы кодирования (UTF8, UTF16, UTF32 и т.д.) которые описывают как именно символ из таблицы Unicode (т.н. code point) будет представлен в виде байтов. Например:
Символ Code point UTF8 UTF16 UTF32
Z \u005A 0x5A 0x5A 0x00 0x5A 0x00 0x00 0x00
Й \u0419 0xD0 0x99 0x19 0x04 0x19 0x04 0x00 0x00
\u307D 0xE3 0x81 0xBD 0x7D 0x30 0x7D 0x30 0x00 0x00
Из этой таблицы видно что Unicode не вляется двухбайтовой кодировкой. Кол-во байтов зависит от символа и используемой схемы кодирования. В среднем UTF8 тратит меньше байтов чем остальные схемы. Поэтому её и любят использовать по умолчанию.

Цитата Сообщение от Volrajas Посмотреть сообщение
я вот что то не пойму чем отличается Encoding.Unicode от Encoding.UTF16?
У класса Encoding нет свойства UTF16. Свойство Encoding.Unicode соответствует UTF16 с little endian порядком байтов. Также есть свойство BigEndianUnicode которое соотствует big endian варианту UTF16.

Цитата Сообщение от Volrajas Посмотреть сообщение
и почему в браузерах используется UTF8 хотя там юникод вроде бы...
Это не совсем так. Браузер отображает страницу в той кодировке которая указана на странице. Это может быть любая кодировка. Не только UTF8. Если кодировка не указана, то браузер может выбрать кодировку UTF8 по умолчанию или попытаться угадать её.

Цитата Сообщение от Volrajas Посмотреть сообщение
и еще такой вопрос у меня есть файл в кодировке ANSI, как мне его сделать в кодировке юникод?
В Windows под ANSI кодировкой понимается кодировка соответствующая текущим региональным настройкам. Получить её можно через свойство Encoding.Default. Перекодировку можно сделать так:
C#
1
2
3
4
// Читаем текст из файла в кодировке ANSI
string s = File.ReadAllText("c:\path\to\file.txt", Encoding.Default);
// Записываем текст в файла в кодировке UTF8
File.WriteAllText("c:\path\to\file.txt", s);
1
veselchack
1 / 1 / 3
Регистрация: 26.10.2015
Сообщений: 25
29.10.2015, 11:37 6
Volrajas, Вы, конечно, извините...но Вас в гугле забанили?
Цитата Сообщение от Volrajas Посмотреть сообщение
я не знаю что такое little endian
Порядок байтов - wiki
Поиском по форуму тоже не пользовались?
0
Volrajas
Заблокирован
29.10.2015, 12:28  [ТС] 7
Цитата Сообщение от OwenGlendower Посмотреть сообщение
юникод это многобайтовая кодировка в рамках которой определены схемы кодирования (UTF8, UTF16, UTF32 и т.д.) которые описывают как именно символ из таблицы Unicode (т.н. code point) будет представлен в виде байтов.
теперь стало понятнее
Цитата Сообщение от OwenGlendower Посмотреть сообщение
У класса Encoding нет свойства UTF16. Свойство Encoding.Unicode соответствует UTF16 с little endian порядком байтов. Также есть свойство BigEndianUnicode которое соотствует big endian варианту UTF16.
вот теперь реально понятно все стало
Цитата Сообщение от OwenGlendower Посмотреть сообщение
В Windows под ANSI кодировкой понимается кодировка соответствующая текущим региональным настройкам. Получить её можно через свойство Encoding.Default. Перекодировку можно сделать так:
а можно как то узнать в какой кодировке был файл? вдруг он не в Default, а скажем BigIndian...

Добавлено через 9 минут
вот я нашел у конструктора StreamReader-а такой параметр detectEncodingFromByteOrderMarks, но он че то не всегда верно определяет... щас вот пытаюсь им загрузить файл в кодировке ASCII, а он считает что это кодировка UTF8...
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9691 / 4067
Регистрация: 17.03.2014
Сообщений: 19,339
Записей в блоге: 1
Завершенные тесты: 2
29.10.2015, 12:36 8
Цитата Сообщение от Volrajas Посмотреть сообщение
а можно как то узнать в какой кодировке был файл?
Можно, но этот процесс не является 100% надежным. Смотри ответ в этой теме. Там определение сделано для текста веб страницы, но идея применима для любого текста.

Цитата Сообщение от Volrajas Посмотреть сообщение
вдруг он не в Default, а скажем BigIndian...
Не путай теплое с мягким. Кодировка это одно, а эндианность совсем другое. И пишется это через E (endian), а не I (Indian). С индейцам это никак не связано

Цитата Сообщение от Volrajas Посмотреть сообщение
вот я нашел у конструктора StreamReader-а такой параметр detectEncodingFromByteOrderMarks
Это работает только для кодировок семейства Unicode при наличии специальной метки BOM (byte order mark). Это режим используется по умолчанию так что указывать явно его не нужно.
0
Volrajas
Заблокирован
29.10.2015, 12:43  [ТС] 9
нагуглил еще вот такую шнягу
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static Encoding GetFileEncoding(string srcFile)
{
    // *** Use Default of Encoding.Default (Ansi CodePage)
    Encoding enc = Encoding.Default;
 
    // *** Detect byte order mark if any - otherwise assume default
    byte[] buffer = new byte[5];
    FileStream file = new FileStream(srcFile, FileMode.Open);
    file.Read(buffer, 0, 5);
    file.Close();
 
    if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf)
        enc = Encoding.UTF8;
    else if (buffer[0] == 0xfe && buffer[1] == 0xff)
        enc = Encoding.Unicode;
    else if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff)
        enc = Encoding.UTF32;
    else if (buffer[0] == 0x2b && buffer[1] == 0x2f && buffer[2] == 0x76)
        enc = Encoding.UTF7;
 
    return enc;
}
вроде бы правильно определяет...

Добавлено через 5 минут
Цитата Сообщение от Volrajas Посмотреть сообщение
вроде бы правильно определяет...
хотя нет нефига не правильно, StreamReader все время считал кодировку UTF8, а этот наоборот все время возвращает ASCII
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9691 / 4067
Регистрация: 17.03.2014
Сообщений: 19,339
Записей в блоге: 1
Завершенные тесты: 2
29.10.2015, 15:11 10
Volrajas, данный код может определить только кодировки семейства Unicode при условии наличия BOM. Плюс в коде есть ошибка при определении UTF16. В комментариях к статье есть исправление. Я бы использовал библиотеку UDE.CSharp.
0
Volrajas
Заблокирован
10.11.2015, 20:18  [ТС] 11
а какая кодировка у символов в строках C#? Unicode / UTF16? просто во всяких примерах в интернете по перекодировке строк c# в массив байтов почему то как правило используется UTF8, но я вроде как всю жизнь был уверен что в C# 2х байтные символы... разве нет?
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9691 / 4067
Регистрация: 17.03.2014
Сообщений: 19,339
Записей в блоге: 1
Завершенные тесты: 2
10.11.2015, 20:23 12
Volrajas, string хранится в памяти в кодировке UTF-16. Это было сделано для совместимости с Windows API. Кодировка UTF-8 встречается довольно часто потому что она в среднем более компактная чем UTF-16.
0
Volrajas
Заблокирован
10.11.2015, 20:26  [ТС] 13
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Кодировка UTF-8 встречается довольно часто потому что она в среднем более компактная чем UTF-16.
погодите опять вы меня запутали, что значит частая? как она может быть частой если используется в c# только utf16??? или они комбинируются чтоли как то???
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9691 / 4067
Регистрация: 17.03.2014
Сообщений: 19,339
Записей в блоге: 1
Завершенные тесты: 2
10.11.2015, 20:30 14
Volrajas, я отвечал на два твоих вопроса. Надо было их разделить на разные абзацы чтобы не было путаницы.

В памяти строки всегда хранятся в кодировке UTF-16, но при работе с файлами по умолчанию используется кодировка UTF-8. XML документы также по умолчанию создаются в этой кодировке. При работе с HTTP тоже по умолчанию подразумеватся кодировка UTF-8. Все это я и имел в виду когда говорил что "UTF-8 часто встречается".
0
Volrajas
Заблокирован
10.11.2015, 20:33  [ТС] 15
Цитата Сообщение от OwenGlendower Посмотреть сообщение
XML документы также по умолчанию создаются в этой кодировке. При работе с HTTP тоже по умолчанию подразумеватся кодировка UTF-8.
так у них же есть возможность в коде задать кодировку вроде как...
XML
1
<?xml version="1.0" encoding="UTF-16"?>
оно в этом случае автоматически считается в utf16 или надо еще как то это указать в коде c#?
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9691 / 4067
Регистрация: 17.03.2014
Сообщений: 19,339
Записей в блоге: 1
Завершенные тесты: 2
10.11.2015, 20:37 16
Цитата Сообщение от Volrajas Посмотреть сообщение
Цитата Сообщение от OwenGlendower Посмотреть сообщение
XML документы также по умолчанию создаются в этой кодировке.
так у них же есть возможность в коде задать кодировку вроде как...
То есть фразу "по умолчанию" ты не заметил? Возможность указать кодировку есть, но если её не указывать, то подразумевается UTF-8.

Добавлено через 1 минуту
Цитата Сообщение от Volrajas Посмотреть сообщение
оно в этом случае автоматически считается в utf16 или надо еще как то это указать в коде c#?
Считается. XML парсер об этом позаботится.
0
10.11.2015, 20:37
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2015, 20:37

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Encoding(28595) - строка почему-то не преобразуется
Приветствую! Есть строка &gt;?;0G5=&gt; в онлайне декодере она преобразуется к ОПЛАЧЕНО через...

Смена кодировки без использования Encoding
Задание: Выполнить перекодирование исходного текста без использования системных или других...

Encoding.GetEncoding(1251) выдаёт иероглифы
Помогите с кодировкой.. charset=windows-1251 private void button1_Click(object sender,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.