Кодування Unicode. Юнікод і традиційні кодування

Стандарт запропонований в 1991 році некомерційною організацією «Консорціум Юнікоду» (англ. Unicode Consortium, Unicode Inc.). Застосування цього стандарту дозволяє закодувати дуже велике число символів з різних писемностей: у документах Unicode можуть сусідити китайські ієрогліфи, математичні символи, букви грецького алфавіту, латиниці і кирилиці, при цьому стає непотрібним переключення кодових сторінок.

Однією з переваг використання скриптів є те, що можна швидко видалити підпис з кількох файлів. Фактично, сценарій може запускатися автоматично як частина процесу. Необхідно перевірити ефект видалення підпису в потоці процесу. Кодування польських символів - це запис певного символу у вигляді байтів, понятих комп'ютера, які потім перетворюються в візуальні символи і числа, видимі кінцевому користувачеві.

Проблеми з кодуванням польських символів

Найбільш відомими проблемами є ті, в яких ми показуємо кущі або знаки питання замість польських символів. Це зазвичай це пов'язано з тим фактом, що ми читаємо символи в іншому кодуванні, ніж вони були написані, або неправильним перетворенням, що означає, що даний байт, який є іншим символом в кодованому кодуванні, в якій ми його читаємо, є абсолютно іншим символом. Це повинно нам допомогти, але тільки якщо у файлі немає ніяких знаків, тому що якщо це так, знайдіть будь-яку копію, де є польські знаки або кущі.

Стандарт складається з двох основних розділів: універсальний набір символів (англ. UCS, universal character set) і сімейство кодувань (англ. UTF, Unicode transformation format). Універсальний набір символів задає однозначну відповідність символів кодам - ​​елементам кодового простору, що представляє невід'ємні цілі числа. Сімейство кодувань визначає машинне представлення послідовності кодів UCS.

Кодування символів в текстовому редакторі

Нижче наведено приклад тексту, який був прочитаний в іншому кодуванні, ніж був написаний, що призвело до зовсім інших буквах, ніж повинно бути. Це дозволить використовувати файли, про які йде мова; настройки кодування і типу вмісту. За вищезгаданих причин необхідно зробити висновок про те, що кодування повинна бути налаштована на правильне зчитування символів. Ми повинні почати з нашого текстового редактора; Найчастіше при відкритті файлу у нас є вікно для вибору кодування, ви також можете надовго встановити редактор в відповідні налаштування.

Стандарт Unicode був розроблений з метою створення єдиної кодування символів всіх сучасних і багатьох давніх писемних мов. Кожен символ в цьому стандарті кодується 16 бітами, що дозволяє йому охопити незрівнянно більшу кількість символів, ніж прийняті раніше 8-бітові кодування. Ще однією важливою відмінністю Unicode від інших систем кодування є те, що він не тільки приписує кожному символу унікальний код, але і визначає різні характеристики цього символу, наприклад:

Виберіть кодування символів в текстовому редакторі. Налаштування кодування бази даних вже є більш складним завданням. Оскільки у нас зазвичай немає доступу до файлу конфігурації, крім приватних серверів, тоді ви повинні встановити кодування і порівняння зі скриптом, який підключається до бази даних. Порівняння з'єднання - це не що інше, як порядок символів, який враховується при сортуванні результатів і т.д. буквами.

Щоб переглянути список доступних кодувань і відповідні їм значення за замовчуванням на сервері бази даних, запитайте. Список доступних порівнянь для кожного кодування буде повернутий після завершення запиту. Щоб наш сервер працював з кодуванням, вам потрібно додати два записи в файл конфігурації, один з яких визначає кодування, а інший - порівняння. Це вимагає від нас доступу до цього файлу, що зазвичай пов'язано з тим, що ми повинні бути власником приватного сервера.

Тип символу (прописна буква, мала літера, цифра, розділовий знак і т.д.);

Атрибути символу (відображення зліва направо або справа наліво, пробіл, розрив рядка і т.д.);

Відповідна прописна або рядкова буква (для малих і великих літер відповідно);

Відповідне числове значення (для цифрових символів).

Збережіть файл і перезапустіть сервер, якщо все буде добре, тоді сервер буде працювати в даному кодуванні і порівнянні. Щоб перевірити поточні налаштування кодування, виконайте запит. Але для перевірки налаштувань порівняння. Ці настройки сервера успадковують всі новостворені бази даних, таблиці та поля і стовпці, якщо ви не встановите іншу систему кодування відповідно або їх батьківський набір відрізняється кодуваннями.

Кожна база даних має свої власні настройки кодування за замовчуванням і порівнює з'єднання, успадковане від налаштувань сервера. Кодування з бази даних успадковується таблицями. Щоб встановити кодування для конкретної бази даних, вам необхідно запросити.

Весь діапазон кодів від 0 до FFFF розбитий на кілька стандартних підмножин, кожне з яких відповідає або алфавітом якоїсь мови, або групі спеціальних символів, Подібних за своїми функціями. На наведеній нижче схемі міститься загальний перелік підмножин Unicode 3.0 (малюнок 2).

малюнок 2

Стандарт Unicode є основою для зберігання і тексту в багатьох сучасних комп'ютерних системах. Однак, він не сумісний з більшістю Інтернет-протоколів, оскільки його коди можуть містити будь-які байтові значення, а протоколи зазвичай використовують байти 00 - 1F і FE - FF в якості службових. Для досягнення сумісності були розроблені кілька форматів перетворення Unicode (UTFs, Unicode Transformation Formats), з яких на сьогодні найбільш поширеним є UTF-8. Цей формат визначає наступні правила перетворення кожного коду Unicode в набір байтів (від одного до трьох), придатних для транспортування Інтернет-протоколами.

Якщо імя_бази має бути замінено на правильне ім'я бази даних, для якої ми хочемо встановити кодування. Кодування таблиць або полів в таблиці не буде змінено. Кодування бази даних також можна налаштувати при створенні бази даних, незалежно від налаштувань сервера, шляхом виконання запиту.

Таблиці в базі даних мають свої власні настройки для порівняння і кодування символів, які успадковуються від налаштувань бази даних, в якій вони розташовані. Налаштування кодування і порівняння для таблиці виконується за запитом. Кодування полів і стовпців залишиться незмінним. Кодування таблиці може бути визначено незалежно від параметрів сервера і бази даних, в якій знаходиться таблиця. Це можна визначити при створенні таблиці, полів і стовпців успадковує цей параметр.

Тут x, y, z позначають біти вихідного коду, які повинні вилучатися, починаючи з молодшого, і заноситися в байти результату справа наліво, поки не будуть заповнені всі зазначені позиції.

Подальший розвиток стандарту Unicode пов'язано з додаванням нових мовних площин, тобто символів в діапазонах 10000 - 1FFFF, 20000 - 2FFFF і т.д., куди передбачається включати кодування для письменностей мертвих мов, що не потрапили в таблицю, наведену вище. Для кодування цих додаткових символів був розроблений новий формат UTF-16.

Встановіть кодування полів і стовпців при створенні і додаванні їх

Щоб змінити цю установку потрібне знання типу цього поля і його імені та імені таблиці. Якщо ви хочете додати існуючу таблицю в існуючу таблицю, то ваш запит повинен містити відповідні визначення кодування. Ви можете зробити це, виконавши запит відразу після підключення до бази даних або вибравши базу даних, щоб результати були повернуті в обраній вами кодуванні. Один запит задає одну змінну за раз, тобто.

Зміни, зроблені за допомогою цього запиту, можуть бути легко перевірені за допомогою двох запитів, першого для кодування. Ви також хочете встановити часовий пояс за умовчанням. Ви можете визначити кодування на сервері декількома способами, встановити за замовчуванням для сервера, типи файлів або форсувати тип або настройку заголовка. Фільтрації не сортує дані, вона просто приховує дані, які ми не хочемо переглядати.

Таким чином, існує 4 основних способи кодування байтами в форматі Unicode:

UTF-8: 128 символів кодуються одним байтом (формат ASCII), 1920 символів кодуються 2-мя байтами ((Roman, Greek, Cyrillic, Coptic, Armenian, Hebrew, Arabic символи), 63488 символів кодуються 3-ма байтами (Китайська, японська та ін.) Решту 2 147 418 112 символи (ще не використані) можуть бути закодовані 4, 5 або 6-ю байтами.

UCS-2: Кожен символ представлений 2-ма байтами. Дана кодування включає лише перші 65 535 символів з формату Unicode.

UTF-16: Чи є розширенням UCS-2, налічує 1 114 112 символів формату Unicode. Перші 65 535 символів представлені 2-ма байтами, інші - 4-ма байтами.

USC-4: Кожен символ кодується 4-ма байтами.

Ця документація переміщена в архів і не підтримується.

Використання кодування Юнікод

.NET Framework 3.5

Оновлений: Листопад 2007

У додатках, орієнтованих на загальну середу виконання, для перетворення символів з внутрішнього подання (Юнікод) в інший вид використовується кодування. Для зворотного перетворення знаків із зовнішніх кодувань (НЕ Юнікод) у внутрішнє представлення використовується декодування. Простір імен має ряд класів, що дозволяють додаткам кодувати і декодувати символи. Загальні відомості про ці класах см. В розділі.

Стандарт Юникода привласнює кожному символу в кожному підтримуваному сценарії кодову позицію (номер). UTF- це формат, який використовується для кодування кодової точки. Стандарт Юникода версії 3.2 використовує формати перетворення (UTF) та інші кодування, перераховані в наступній таблиці. Для всіх кодувань вбудовані строкі.NET Framework є власними рядками UTF-16.

Кодування Юнікод UTF-32

Являє символи Юнікоду в вигляді послідовності 32-розрядних цілих чисел. Додаток може використовувати клас для перетворення символів в формат кодування UTF-32 і назад.

UTF-32 використовується в разі, коли з додатком необхідно уникнути поведінки замісної кодової точки UTF-16 в операційних системах, де закодоване простір має велике значення. Зверніть увагу, що для кодування окремих відображаються "гліфів" може використовуватися кілька символів UTF-32. Додаткові символи, підвладні впливу такої поведінки, зустрічаються рідше, ніж символи BMP Юникода.

Кодування Юнікод UTF-16

Являє символи Юнікоду в вигляді послідовності 16-розрядних цілих чисел. Додаток може використовувати клас для перетворення символів в формат кодування UTF-16 і назад.

UTF-16 часто використовується у вигляді вбудованого формату, як тип Microsoft.Net char, Тип Windows WCHAR   та інші загальні типи. Більшість поширених кодових точок Юникода приймають тільки одну кодову точку UTF-16 (2 байта). Для додаткових символів Юнікоду U + 10000 і вище, як і раніше потрібно дві заміщають кодові точки UTF.

Кодування Юнікод UTF-8

Являє символи Юнікод у вигляді послідовності довжиною 8 біт. Додаток може використовувати клас для перетворення символів в формат кодування UTF-8 і назад.

UTF-8 призначений для кодування за допомогою 8-разарядной системи і добре працює з багатьма операційними системами. Для діапазону символів ASCII UTF-8 ідентичний кодуванні ASCII і представляє більш широкий набір символів. Однак для сценаріїв CJK UTF-8 може зажадати три байта для кожного символу, створюючи, таким чином, дані більшого розміру, ніж UTF-16. Зверніть увагу, що іноді збільшення розміру діапазону CJK пояснюється обсягом даних ASCII, наприклад тегами HTML.

Кодування Юнікод UTF-7

Являє символи Юнікоду в вигляді послідовності 7-розрядних символів ASCII. Додаток може використовувати клас для перетворення символів в формат кодування UTF-7 і назад. Символи, відмінні від ASCII Юникода, представлені у вигляді escape-послідовності символів ASCII.

UTF-7 підтримує певні протоколи, для яких він необхідний. Найчастіше це протоколи електронної пошти   і груп новин. Однак формат UTF-7 недостатньо безпечний або надійний. У деяких випадках зміна одного біта може привести до істотної зміни інтерпретації всього рядка UTF-7. В інших ситуаціях для кодування одного і того ж тексту можуть використовуватися різні рядки UTF-7. У послідовності, що містять відмінні від ASCII символи, формат UTF-7 набагато менш ефективно використовує простір, ніж UTF-8, і процес кодування / декодування виконується повільніше. Отже, формат UTF-8 є більш прийнятним для роботи в додатках.

Кодування ASCII

У кодуванні ASCII знаки латинського алфавіту кодуються як 7-розрядні символи ASCII. Так як це кодування підтримує тільки значення символів від U + 0000 до U + 007F, то в багатьох випадках вона не відповідає вимогам міжнародних програм. Додаток може використовувати клас для перетворення символів в формат кодування ASII і назад. Приклади використання цього класу в коді см. В розділі.

Кодування ANSI і ISO

Використовуються для кодування, відмінною від Юнікод. Клас підтримує широкий діапазон кодувань ANSI / ISO.

Довільні колекції чисел (байт або символів) не є допустимими рядками або колекціями Юникода. Додаток не може перетворити масив байтів в формат Юнікоду і назад, тому він працювати не буде. Певні послідовності символів і кодових позицій не підтримуються в Юнікод 5.0 і не можуть бути перетворені за допомогою кодувань Юнікоду. Якщо додаток має передати дані в двійковому форматі, слід використовувати базовий 64 або інший формат, призначений для цієї мети.

Щоб повернути необхідний об'єкт кодування для зазначеної кодування, в додатку можна використовувати метод. Для перетворення рядка Юникода в її байтовое подання до зазначеної кодуванні використовується метод.

Наведений нижче приклад коду використовує метод GetEncoding   необхідного об'єкта кодування для конкретної кодової сторінки. метод GetBytes   викликається для потрібного об'єкту кодування для перетворення рядка Юникода в байтовое подання до необхідної кодуванні. На екрані буде відображено байтовое уявлення рядки на конкретній кодової сторінці.

using System; using System.IO; using System.Globalization; using System.Text; public class Encoding_UnicodeToCP (public static void Main () ( // Converts ASCII characters to bytes. // Displays the string "s byte representation in the    // specified code page. // Code page 1252 represents Latin characters.    PrintCPBytes ( "Hello, World!", 1252); // Code page 932 represents Japanese characters.    PrintCPBytes ( "Hello, World!", 932); // Converts Japanese characters to bytes.    PrintCPBytes (, 1252); PrintCPBytes ( "\\ U307b, \\ u308b, \\ u305a, \\ u3042, \\ u306d", 932); ) Public static void PrintCPBytes (string str, int codePage) (Encoding targetEncoding; byte encodedChars; // Gets the encoding for the specified code page.    targetEncoding = Encoding.GetEncoding (codePage); // Gets the byte representation of the specified string.    encodedChars = targetEncoding.GetBytes (str); // Prints the bytes. Console.WriteLine ( "Byte representation of" (0) "in Code Page" (1) ":", Str, codePage); for (int i = 0; i< encodedChars.Length; i++) Console.WriteLine("Byte {0}: {1}" , i, encodedChars[i]); } }

При використанні даного коду в консольному додатку зазначені текстові елементи Юникода можуть відображатися неправильно. Підтримка символів Юнікоду в консольної середовищі залежить від встановленої версії операційної системи   Windows.