С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/55: Рейтинг темы: голосов - 55, средняя оценка - 4.82
Заблокирован

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

29.10.2015, 08:58. Показов 11377. Ответов 15

Студворк — интернет-сервис помощи студентам
я вот что то не пойму чем отличается Encoding.Unicode от Encoding.UTF16? и почему в браузерах используется UTF8 хотя там юникод вроде бы... юникод он же 2х байтный, значит UTF16 это и есть юникод разве нет? и еще такой вопрос у меня есть файл в кодировке ANSI, как мне его сделать в кодировке юникод?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.10.2015, 08:58
Ответы с готовыми решениями:

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

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

Ошибка с Encoding.RegisterProvider
Всем привет) Ребят ошибка выходит , как быть? Проект прикреплён, Заранее спасибо) ...

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

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

Добавлено через 3 минуты
А еще здесь есть табличка, которая должна тебе помочь
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
29.10.2015, 11:15
Encoding.Unicode - это UTF-16 little endian.
Сравнительные таблицы юникодов можно посмотреть на вики.
0
Заблокирован
29.10.2015, 11:27  [ТС]
Цитата Сообщение от veselchack Посмотреть сообщение
Для смены кодировки используйте текстовый редактор.
Например в стандартном блокноте - Файл - Сохранить как, и внизу диалога сохранения есть выпадающий список с типами кодировки.
нет мне надо чтоб моя программа сама меняла кодировку файла
Цитата Сообщение от veselchack Посмотреть сообщение
Есть замечательный сайт MSDN. Если поискать там класс Encoding, то можно найти там описание его свойств и методов.
"Получает кодировку для формата UTF-16 с прямым порядком байтов." то бишь это эквивалент UTF-16 или все таки есть отличия?
Цитата Сообщение от veselchack Посмотреть сообщение
А еще здесь есть табличка, которая должна тебе помочь
тут не указан Encoding.Unicode
Цитата Сообщение от Exerion Посмотреть сообщение
Encoding.Unicode - это UTF-16 little endian.
я не знаю что такое little endian, так разница какая то между ними есть?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14165 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
29.10.2015, 11:36
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
1 / 1 / 3
Регистрация: 26.10.2015
Сообщений: 25
29.10.2015, 11:37
Volrajas, Вы, конечно, извините...но Вас в гугле забанили?
Цитата Сообщение от Volrajas Посмотреть сообщение
я не знаю что такое little endian
Порядок байтов - wiki
Поиском по форуму тоже не пользовались?
0
Заблокирован
29.10.2015, 12:28  [ТС]
Цитата Сообщение от 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
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14165 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
29.10.2015, 12:36
Цитата Сообщение от Volrajas Посмотреть сообщение
а можно как то узнать в какой кодировке был файл?
Можно, но этот процесс не является 100% надежным. Смотри ответ в этой теме. Там определение сделано для текста веб страницы, но идея применима для любого текста.

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

Цитата Сообщение от Volrajas Посмотреть сообщение
вот я нашел у конструктора StreamReader-а такой параметр detectEncodingFromByteOrderMarks
Это работает только для кодировок семейства Unicode при наличии специальной метки BOM (byte order mark). Это режим используется по умолчанию так что указывать явно его не нужно.
0
Заблокирован
29.10.2015, 12:43  [ТС]
нагуглил еще вот такую шнягу
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
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14165 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
29.10.2015, 15:11
Volrajas, данный код может определить только кодировки семейства Unicode при условии наличия BOM. Плюс в коде есть ошибка при определении UTF16. В комментариях к статье есть исправление. Я бы использовал библиотеку UDE.CSharp.
0
Заблокирован
10.11.2015, 20:18  [ТС]
а какая кодировка у символов в строках C#? Unicode / UTF16? просто во всяких примерах в интернете по перекодировке строк c# в массив байтов почему то как правило используется UTF8, но я вроде как всю жизнь был уверен что в C# 2х байтные символы... разве нет?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14165 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
10.11.2015, 20:23
Volrajas, string хранится в памяти в кодировке UTF-16. Это было сделано для совместимости с Windows API. Кодировка UTF-8 встречается довольно часто потому что она в среднем более компактная чем UTF-16.
0
Заблокирован
10.11.2015, 20:26  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Кодировка UTF-8 встречается довольно часто потому что она в среднем более компактная чем UTF-16.
погодите опять вы меня запутали, что значит частая? как она может быть частой если используется в c# только utf16??? или они комбинируются чтоли как то???
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14165 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
10.11.2015, 20:30
Volrajas, я отвечал на два твоих вопроса. Надо было их разделить на разные абзацы чтобы не было путаницы.

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

Добавлено через 1 минуту
Цитата Сообщение от Volrajas Посмотреть сообщение
оно в этом случае автоматически считается в utf16 или надо еще как то это указать в коде c#?
Считается. XML парсер об этом позаботится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.11.2015, 20:37
Помогаю со студенческими работами здесь

Encoding: перекодировка русских букв
Доброго времени суток! Есть кусок кода string welcome = &quot;Привет Welcome&quot;; data = Encoding.GetEncoding(1251).GetBytes(welcome); ...

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

Как работать с классом Encoding
Написал в блокноте тесты(test.cmd). Знаю, что в командной сторкое кирилица автоматически из аски конвертируется в ютф16, а на выход обратно...

Операция обратная Encoding.GetBytes()
string str = &quot;21&quot;; byte send2 = Encoding.ASCII.GetBytes(str); Console.Write(send2); Выводит &quot;49&quot;. Как из этого обратно получить...

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru