Кодировка utf 8 для windows

Отличие utf-8 и windows 1251. Рассмотрим, чем отличаются две кодировки «utf-8 и windows 1251» в теории и на практике. И как победить некоторые проблемы для кириллицы в utf-8!?

  • О кодировках utf-8 и windows 1251

    Самое главное. что нас интересует, как и меня — в чем же отличие кодировок utf-8 и windows 1251. И отличается только кириллица!

    Чем отличаются utf-8 и windows 1251

    UTF-8 — это много-байтовая кодировка, а Windows- 1251 однобайтовая. И более того, отличие только в кириллице.

    Количество байтов кириллицы в UTF-8 будет в 2 раза больше, чем 1). латиницы в UTF-8 и 2). латиницы + кириллицы в Windows- 1251 → пример

    Главное отличие кодировок – это используемый набор символов. В UTF-8 гораздо больше количество символов возможно представить, чем в Windows- 1251. Кодировка Windows- 1251 однобайтовая, т.е. представить в ней можно только 255 символов. Для кириллицы, впрочем, этого вполне достаточно, именно поэтому однобайтовые кодировки до сих пор так массово применяются.

    Что такое кодировка windows 1251

    Windows-1251 – набор символов и кодировка, являющаяся стандартной 8-битной кодировкой для всех русских версий Microsoft Windows. Пользуется довольно большой популярностью. Windows-1251 выгодно отличается от других 8‑битных кириллических кодировок (таких как CP866, KOI8-R и ISO 8859-5) наличием практически всех символов, использующихся в русской типографике для обычного текста; она также содержит все символы для близких к русскому языку языков: украинского, белорусского, сербского и болгарского.

    Что такое кодировка UTF-8

    UTF-8 – в настоящее время распространённая кодировка, реализующая представление Юникода, совместимое с 8-битным кодированием текста. Нашла широкое применение в операционных системах и веб-пространстве. Текст, состоящий только из символов Юникода с номерами меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байт.

    Символ в кодировке UTF-8 может кодироваться аж 6 байтами (пока используется только 4 и больше не планируется). Для русского языка, например, символ занимает 2 байта. Все символы, которые есть в таблице символов – поддерживаются этой кодировкой. К примеру, если вам нужен знак копирайта (©), то вам не нужно искать особый шрифт или же изображать символов в графическом формате.

  • Пример вывода текста в кодировках utf-8 латиницы

    Когда и если вы прочитали теорию о разнице кодировок utf-8 и windows 1251 — это уже победа! wall
    смайлы

    А если вы еще и поняли о чем идет речь, то вы вообще Эйнштейн! good
    смайлы, то и смысла особого вам читать дальше нет.

    А для всех остальных продолжим…

    Чем отличается текст в кодировках utf-8 и windows 1251

    Теория — это конечно классно и круто, но как обстоит дело на практике!

    Как показать отличие двух кодировок!?

    У нас на сайте основная кодировка utf-8, и мы не напрягаясь можем посмотреть, что творится с текстом в этой кодировке!

    Нам понадобится какой-то текст на латинице:

    И… нам нужно такое слово, чтобы имело одинаковое количество букв в слове, ну пусть это будет моё имя…

    Пусть это будет слово — «Marat!»

    Далее нам потребуется функция var_dump.

    И выведем прямо здесь вот такую конструкцию :

    var_dump(‘Marat’);

    Результат:

    string(5) «Marat»

    Что мы здесь можем прочитать!?

    Что это строка, и что в ней 5 элементов.

  • Пример вывода текста в кодировках utf-8 кириллицы

    Теперь, проделаем тоже самое со строкой на кириллице:

    У нас все таже кодировка utf-8.

    Но теперь нам понадобится текст на кириллице:

    Пусть это будет слово — «Марат!»

    Опять var_dump.

    И выведем прямо здесь вот такую конструкцию :

    var_dump(‘Марат’);

    Результат:

    string(10) «Марат»

    И что мы здесь видим!?

    Что количество элементов в строке 10… Если вы читали теорию внимательно, то вот вам показатель того, что одна буква состоит из двух символов, а латиницы это не касается…!

    Поэтому, и возникают проблемы с текстом в кодировке utf-8 кириллицы, множество функций тупо не работают.

    Как пример…как-то я задолбался со strtolower в utf-8 для кириллицы, что решил написать собственную функцию strtolower, чтобы каждый раз не городить этажерку из нескольких функций…

  • Пример отличия в кодировках utf-8 и windows 1251

    Если вы поленились прочитать два верхних пункта, то ещё раз выведем результаты вывода текста на латинице и на кириллице с одним количеством букв.

    Результат вывода var_dump(‘Marat’);:
    string(5) «Marat»

    Результат var_dump(‘Марат’);:
    string(10) «Марат»

    Что делать, если функция для кириллицы на utf-8 не работают?

    Поскольку я давно занимаюсь сайтами, то могу сказать, что на самом деле таких случаев не так много, когда нужна какая-то специальная функция для обработки кириллицы на utf-8.

    Но если уж она возникала, то есть несколько вариантов решения!

    Это функции с приставкой «mb_», естественно надо проверять, работает ли она у вас на хостинге.

    Второй вариант, это написать собственную функцию, которая будет работать и для латиницы и кириллицы? как это я показал на функции strtolower

    И третий вариант перекодировать строку из utf-8 в windows 1251

    Рассмотрим, первый попавшийся на ум пример…

    Пусть это будет функция str_split и её аналог mb_str_split

    print_r (str_split(‘Марат’)); выдаст :

    Array

    (

    [0] => �

    [1] => �

    [2] => �

    [3] => �

    [4] => �

    [5] => �

    [6] => �

    [7] => �

    [8] => �

    [9] => �

    )

    print_r (mb_str_split(‘Марат’)); выдаст :

    Что делать, если функция для кириллицы на utf-8 не работают?

    Как видим… полный отстой…

    Мы далее разбирались с этим здесь.

  • Как перекодировать строку из utf-8 в windows 1251

    Итак… есть третий вариант, борьбы с квадратиками(непонимание кодировки) — перекодировать строку из utf-8 в windows 1251:

    iconv(«UTF-8», «windows-1251», $text)

    После того, как вы выполнили все намеченные действия с текстом, возвращаем его в исходную кодировку :

    iconv(«windows-1251», «UTF-8», $text)

    Рассмотрим пример перекодировки текста из UTF-8 в windows-1251 и обратно

    Мы использовали var_dump, и он посчитал не правильно, поскольку просто так, на страницу вывести данные с помощью var_dump нельзя, мы использовали вот такой костыль :

    ob_start();

    var_dump( ‘Марат’ );

    echo ob_get_clean();

    Теперь попробуем перекодировать строку прямо внутри :

    ob_start();

    var_dump(iconv(«UTF-8», «windows-1251», ‘Марат’)) ;

    echo ob_get_clean() ;

    Результат подсчета знаков верный, но видим что слово не было перекодировано обратно :

    string(5) «�����»

    Исправим:

    ob_start();

    var_dump(iconv(«UTF-8», «windows-1251», ‘Марат’)) ;

    echo iconv(«windows-1251», «UTF-8», ob_get_clean());

    Результат :

    string(5) «Марат»

    Итак… вы видели процесс кодировки и перекодировки текста из utf-8 в windows 1251, а потом обратно!


    Вы наверное подумали :

    Что за дичь здесь происходит!? Это не дичь! Когда ты внутри, а не снаружи, то все кажется не простым, а очень простым.

    И чем больше ты в теме, это просто, как есть, пить, дышать… просто не задумываешься…

    Я не говорю, что всегда так, иногда бывает очень трудно какаю-то задачку решить… shootself2
    смайлы

  • Что лучше для кириллицы utf-8 или…

    Интересный поисковый запрос — «Что лучше для кириллицы utf-8 или…«…

    Дело в том, что я выбрал кодировку «utf-8» уже… 14 лет(число динамическое) назад… и… уже сейчас трудно вспомнить, почему именно её… но точно вам могу заявить, что когда-то пользовался «windows-1251″… и у неё были какие-то заморочки, в виде неадекватного вывода информации, что, я волей неволей перешел на «utf-8»

    Какие минусы у utf-8?

    Одна из самых главных проблем «utf-8» — это многобайтовость…

    Да! Это несколько неудобно в самом начале, но для всякой функции, которая не хочет работать с кириллицей, существуют замены.

    В процессе создания сайта у вас может возникнуть несколько проблем, которые вы решите и «тупо» забудете об этом…

    Задумывался ли я о переходе с кодировки utf-8 на другую?

    Смысл задумываться о переходе с кодировки utf-8 на другую, если всё работает так, как нужно!

    From Wikipedia, the free encyclopedia

    Windows code pages are sets of characters or code pages (known as character encodings in other operating systems) used in Microsoft Windows from the 1980s and 1990s. Windows code pages were gradually superseded when Unicode was implemented in Windows,[citation needed] although they are still supported both within Windows and other platforms, and still apply when Alt code shortcuts are used.

    There are two groups of system code pages in Windows systems: OEM and Windows-native («ANSI») code pages.
    (ANSI is the American National Standards Institute.) Code pages in both of these groups are extended ASCII code pages. Additional code pages are supported by standard Windows conversion routines, but not used as either type of system code page.

    ANSI code page[edit]

    Windows-125x series

    Alias(es) ANSI (misnomer)
    Standard WHATWG Encoding Standard
    Extends US-ASCII
    Preceded by ISO 8859
    Succeeded by Unicode
    UTF-16 (in Win32 API)
    • v
    • t
    • e

    ANSI code pages (officially called «Windows code pages» [1] after Microsoft accepted the former term being a misnomer [2]) are used for native non-Unicode (say, byte oriented) applications using a graphical user interface on Windows systems. The term «ANSI» is a misnomer because these Windows code pages do not comply with any ANSI (American National Standards Institute) standard; code page 1252 was based on an early ANSI draft that became the international standard ISO 8859-1, [2] which adds a further 32 control codes and space for 96 printable characters. Among other differences, Windows code-pages allocate printable characters to the supplementary control code space, making them at best illegible to standards-compliant operating systems.)

    Most legacy «ANSI» code pages have code page numbers in the pattern 125x. However, 874 (Thai) and the East Asian multi-byte «ANSI» code pages (932, 936, 949, 950), all of which are also used as OEM code pages, are numbered to match IBM encodings, none of which are identical to the Windows encodings (although most are similar). While code page 1258 is also used as an OEM code page, it is original to Microsoft rather than an extension to an existing encoding. IBM have assigned their own, different numbers for Microsoft’s variants, these are given for reference in the lists below where applicable.

    All of the 125x Windows code pages, as well as 874 and 936, are labelled by Internet Assigned Numbers Authority (IANA) as «Windows-number«, although «Windows-936» is treated as a synonym for «GBK». Windows code page 932 is instead labelled as «Windows-31J».[3]

    ANSI Windows code pages, and especially the code page 1252, were so called since they were purportedly based on drafts submitted or intended for ANSI. However, ANSI and ISO have not standardized any of these code pages. Instead they are either:[2]

    • Supersets of the standard sets such as those of ISO 8859 and the various national standards (like Windows-1252 vs. ISO-8859-1),
    • Major modifications of these (making them incompatible to various degrees, like Windows-1250 vs. ISO-8859-2)
    • Having no parallel encoding (like Windows-1257 vs. ISO-8859-4; ISO-8859-13 was introduced much later). Also, Windows-1251 follows neither the ISO-standardised ISO-8859-5 nor the then-prevailing KOI-8.

    Microsoft assigned about twelve of the typography and business characters (including notably, the euro sign, €) in CP1252 to the code points 0x80–0x9F that, in ISO 8859, are assigned to C1 control codes. These assignments are also present in many other ANSI/Windows code pages at the same code-points. Windows did not use the C1 control codes, so this decision had no direct effect on Windows users. However, if included in a file transferred to a standards-compliant platform like Unix or MacOS, the information was invisible and potentially disruptive.[citation needed]

    OEM code page[edit]

    The OEM code pages (original equipment manufacturer) are used by Win32 console applications, and by virtual DOS, and can be considered a holdover from DOS and the original IBM PC architecture. A separate suite of code pages was implemented not only due to compatibility, but also because the fonts of VGA (and descendant) hardware suggest encoding of line-drawing characters to be compatible with code page 437. Most OEM code pages share many code points, particularly for non-letter characters, with the second (non-ASCII) half of CP437.

    A typical OEM code page, in its second half, does not resemble any ANSI/Windows code page even roughly. Nevertheless, two single-byte, fixed-width code pages (874 for Thai and 1258 for Vietnamese) and four multibyte CJK code pages (932, 936, 949, 950) are used as both OEM and ANSI code pages. Code page 1258 uses combining diacritics, as Vietnamese requires more than 128 letter-diacritic combinations. This is in contrast to VISCII, which replaces some of the C0 (i.e. ASCII) control codes.

    History[edit]

    Initially, computer systems and system programming languages did not make a distinction between characters and bytes: for the segmental scripts used in most of Africa, the Americas, southern and south-east Asia, the Middle East and Europe, a character needs just one byte, but two or more bytes are needed for the ideographic sets used in the rest of the world. This subsequently led to much confusion. Microsoft software and systems prior to the Windows NT line are examples of this, because they use the OEM and ANSI code pages that do not make the distinction.

    Since the late 1990s, software and systems have adopted Unicode as their preferred storage format; this trend has been improved by the widespread adoption of XML which default to UTF-8 but also provides a mechanism for labelling the encoding used.[4] All current Microsoft products and application program interfaces use Unicode internally,[citation needed] but some applications continue to use the default encoding of the computer’s ‘locale’ when reading and writing text data to files or standard output.[citation needed] Therefore, files may still be encountered that are legible and intelligible in one part of the world but unintelligible mojibake in another.

    UTF-8, UTF-16[edit]

    Microsoft adopted a Unicode encoding (first the now-obsolete UCS-2, which was then Unicode’s only encoding), i.e. UTF-16 for all its operating systems from Windows NT onwards, but additionally supports UTF-8 (aka CP_UTF8) since Windows 10 version 1803.[5]
    UTF-16 uniquely encodes all Unicode characters in the Basic Multilingual Plane (BMP) using 16 bits but the remaining Unicode (e.g. emojis) is encoded with a 32-bit (four byte) code – while the rest of the industry (Unix-like systems and the web), and now Microsoft chose UTF-8 (which uses one byte for the 7-bit ASCII character set, two or three bytes for other characters in the BMP, and four bytes for the remainder).

    List[edit]

    The following Windows code pages exist:

    Windows-125x series[edit]

    These nine code pages are all extended ASCII 8-bit SBCS encodings, and were designed by Microsoft for use as ANSI codepages on Windows. They are commonly known by their IANA-registered[6] names as windows-<number>, but are also sometimes called cp<number>, «cp» for «code page». They are all used as ANSI code pages; Windows-1258 is also used as an OEM code page.

    The Windows-125x series includes nine of the ANSI code pages, and mostly covers scripts from Europe and West Asia with the addition of Vietnam. System encodings for Thai and for East Asian languages were numbered to match similar IBM code pages and are used as both ANSI and OEM code pages; these are covered in following sections.

    ID Description Relationship to ISO 8859 or other established encodings
    1250[7][8] Latin 2 / Central European Similar to ISO-8859-2 but moves several characters, including multiple letters.
    1251[9][10] Cyrillic Incompatible with both ISO-8859-5 and KOI-8.
    1252[11][12] Latin 1 / Western European Superset of ISO-8859-1 (without C1 controls). Letter repertoire accordingly similar to CP850.
    1253[13][14] Greek Similar to ISO 8859-7 but moves several characters, including a letter.
    1254[15][16] Turkish Superset of ISO 8859-9 (without C1 controls).
    1255[17][18] Hebrew Almost a superset of ISO 8859-8, but with two incompatible punctuation changes.
    1256[19][20] Arabic Not compatible with ISO 8859-6; rather, OEM Code page 708 is an ISO 8859-6 (ASMO 708) superset.
    1257[21][22] Baltic Not ISO 8859-4; the later ISO 8859-13 is closely related, but with some differences in available punctuation.
    1258[23][24] Vietnamese (also OEM) Not related to VSCII or VISCII, uses fewer base characters with combining diacritics.

    DOS code pages[edit]

    These are also ASCII-based. Most of these are included for use as OEM code pages; code page 874 is also used as an ANSI code page.

    • 437 – IBM PC US, 8-bit SBCS extended ASCII.[25] Known as OEM-US, the encoding of the primary built-in font of VGA graphics cards.
    • 708 – Arabic, extended ISO 8859-6 (ASMO 708)
    • 720 – Arabic, retaining box drawing characters in their usual locations
    • 737 – «MS-DOS Greek». Retains all box drawing characters. More popular than 869.
    • 775 – «MS-DOS Baltic Rim»
    • 850 – «MS-DOS Latin 1». Full (re-arranged) repertoire of ISO 8859-1.
    • 852 – «MS-DOS Latin 2»
    • 855 – «MS-DOS Cyrillic». Mainly used for South Slavic languages. Includes (re-arranged) repertoire of ISO-8859-5. Not to be confused with cp866.
    • 857 – «MS-DOS Turkish»
    • 858 – Western European with euro sign
    • 860 – «MS-DOS Portuguese»
    • 861 – «MS-DOS Icelandic»
    • 862 – «MS-DOS Hebrew»
    • 863 – «MS-DOS French Canada»
    • 864 – Arabic
    • 865 – «MS-DOS Nordic»
    • 866 – «MS-DOS Cyrillic Russian», cp866. Sole purely OEM code page (rather than ANSI or both) included as a legacy encoding in WHATWG Encoding Standard for HTML5.
    • 869 – «MS-DOS Greek 2», IBM869. Full (re-arranged) repertoire of ISO 8859-7.
    • 874 – Thai, also used as the ANSI code page, extends ISO 8859-11 (and therefore TIS-620) with a few additional characters from Windows-1252. Corresponds to IBM code page 1162 (IBM-874 is similar but has different extensions).

    East Asian multi-byte code pages[edit]

    These often differ from the IBM code pages of the same number: code pages 932, 949 and 950 only partly match the IBM code pages of the same number, while the number 936 was used by IBM for another Simplified Chinese encoding which is now deprecated and Windows-951, as part of a kludge, is unrelated to IBM-951. IBM equivalent code pages are given in the second column. Code pages 932, 936, 949 and 950/951 are used as both ANSI and OEM code pages on the locales in question.

    ID Language Encoding IBM Equivalent Difference from IBM CCSID of same number Use
    932 Japanese Shift JIS (Microsoft variant) 943[26] IBM-932 is also Shift JIS, has fewer extensions (but those extensions it has are in common), and swaps some variant Chinese characters (itaiji) for interoperability with earlier editions of JIS C 6226. ANSI/OEM (Japan)
    936 Chinese (simplified) GBK 1386 IBM-936 is a different Simplified Chinese encoding with a different encoding method, which has been deprecated since 1993. ANSI/OEM (PRC, Singapore)
    949 Korean Unified Hangul Code 1363 IBM-949 is also an EUC-KR superset, but with different (colliding) extensions. ANSI/OEM (Republic of Korea)
    950 Chinese (traditional) Big5 (Microsoft variant) 1373[27] IBM-950 is also Big5, but includes a different subset of the ETEN extensions, adds further extensions with an expanded trail byte range, and lacks the Euro. ANSI/OEM (Taiwan, Hong Kong)
    951 Chinese (traditional) including Cantonese Big5-HKSCS (2001 ed.) 5471[28] IBM-951 is the double-byte plane from IBM-949 (see above), and unrelated to Microsoft’s internal use of the number 951. ANSI/OEM (Hong Kong, 98/NT4/2000/XP with HKSCS patch)

    A few further multiple-byte code pages are supported for decoding or encoding using operating system libraries, but not used as either sort of system encoding in any locale.

    ID IBM Equivalent Language Encoding Use
    1361 Korean Johab (KS C 5601-1992 annex 3) Conversion
    20000 Chinese (traditional) An encoding of CNS 11643 Conversion
    20001 Chinese (traditional) TCA Conversion
    20002 Chinese (traditional) Big5 (ETEN variant) Conversion
    20003 938 Chinese (traditional) IBM 5550 Conversion
    20004 Chinese (traditional) Teletext Conversion
    20005 Chinese (traditional) Wang Conversion
    20932 954 (roughly) Japanese EUC-JP Conversion
    20936 5479 Chinese (simplified) GB 2312 Conversion
    20949, 51949 970 Korean Wansung (8-bit with ASCII, i.e. EUC-KR)[29] Conversion

    EBCDIC code pages[edit]

    • 37 – IBM EBCDIC US-Canada, 8-bit SBCS[30]
    • 500 – Latin 1
    • 870 – IBM870
    • 875 – cp875
    • 1026 – EBCDIC Turkish
    • 1047 – IBM01047 – Latin 1
    • 1140 – IBM01141
    • 1141 – IBM01141
    • 1142 – IBM01142
    • 1143 – IBM01143
    • 1144 – IBM01144
    • 1145 – IBM01145
    • 1146 – IBM01146
    • 1147 – IBM01147
    • 1148 – IBM01148
    • 1149 – IBM01149
    • 20273 – EBCDIC Germany
    • 20277 – EBCDIC Denmark/Norway
    • 20278 – EBCDIC Finland/Sweden
    • 20280 – EBCDIC Italy
    • 20284 – EBCDIC Latin America/Spain
    • 20285 – EBCDIC United Kingdom
    • 20290 – EBCDIC Japanese
    • 20297 – EBCDIC France
    • 20420 – EBCDIC Arabic
    • 20423 – EBCDIC Greek
    • 20424 – x-EBCDIC-KoreanExtended
    • 20833 – Korean
    • 20838 – EBCDIC Thai
    • 20924 – IBM00924 – IBM EBCDIC Latin 1/Open System (1047 + Euro symbol)
    • 20871 – EBCDIC Icelandic
    • 20880 – EBCDIC Cyrillic
    • 20905 – EBCDIC Turkish
    • 21025 – EBCDIC Cyrillic
    • 21027 – Japanese EBCDIC (incomplete,[31] deprecated)[32]

    [edit]

    • 1200 – Unicode (BMP of ISO 10646, UTF-16LE). Available only to managed applications.[32]
    • 1201 – Unicode (UTF-16BE). Available only to managed applications.[32]
    • 12000 – UTF-32. Available only to managed applications.[32]
    • 12001 – UTF-32. Big-endian. Available only to managed applications.[32]
    • 65000 – Unicode (UTF-7)
    • 65001 – Unicode (UTF-8)

    Macintosh compatibility code pages[edit]

    • 10000 – Apple Macintosh Roman
    • 10001 – Apple Macintosh Japanese
    • 10002 – Apple Macintosh Chinese (traditional) (BIG-5)
    • 10003 – Apple Macintosh Korean
    • 10004 – Apple Macintosh Arabic
    • 10005 – Apple Macintosh Hebrew
    • 10006 – Apple Macintosh Greek
    • 10007 – Apple Macintosh Cyrillic
    • 10008 – Apple Macintosh Chinese (simplified) (GB 2312)
    • 10010 – Apple Macintosh Romanian
    • 10017 – Apple Macintosh Ukrainian
    • 10021 – Apple Macintosh Thai
    • 10029 – Apple Macintosh Roman II / Central Europe
    • 10079 – Apple Macintosh Icelandic
    • 10081 – Apple Macintosh Turkish
    • 10082 – Apple Macintosh Croatian

    ISO 8859 code pages[edit]

    • 28591 – ISO-8859-1 – Latin-1 (IBM equivalent: 819)
    • 28592 – ISO-8859-2 – Latin-2
    • 28593 – ISO-8859-3 – Latin-3 or South European
    • 28594 – ISO-8859-4 – Latin-4 or North European
    • 28595 – ISO-8859-5 – Latin/Cyrillic
    • 28596 – ISO-8859-6 – Latin/Arabic
    • 28597 – ISO-8859-7 – Latin/Greek
    • 28598 – ISO-8859-8 – Latin/Hebrew
    • 28599 – ISO-8859-9 – Latin-5 or Turkish
    • 28600 – ISO-8859-10 – Latin-6
    • 28601 – ISO-8859-11 – Latin/Thai
    • 28602 – ISO-8859-12 – reserved for Latin/Devanagari but abandoned (not supported)
    • 28603 – ISO-8859-13 – Latin-7 or Baltic Rim
    • 28604 – ISO-8859-14 – Latin-8 or Celtic
    • 28605 – ISO-8859-15 – Latin-9
    • 28606 – ISO-8859-16 – Latin-10 or South-Eastern European
    • 38596 – ISO-8859-6-I – Latin/Arabic (logical bidirectional order)
    • 38598 – ISO-8859-8-I – Latin/Hebrew (logical bidirectional order)

    ITU-T code pages[edit]

    • 20105 – 7-bit IA5 IRV (Western European)[33][34][35]
    • 20106 – 7-bit IA5 German (DIN 66003)[33][34][36]
    • 20107 – 7-bit IA5 Swedish (SEN 850200 C)[33][34][37]
    • 20108 – 7-bit IA5 Norwegian (NS 4551-2)[33][34][38]
    • 20127 – 7-bit US-ASCII[33][34][39]
    • 20261 – T.61 (T.61-8bit)
    • 20269 – ISO-6937

    KOI8 code pages[edit]

    • 20866 – Russian – KOI8-R
    • 21866 – Ukrainian – KOI8-U (or KOI8-RU in some versions)[40]

    Problems arising from the use of code pages[edit]

    Microsoft strongly recommends using Unicode in modern applications, but many applications or data files still depend on the legacy code pages.

    • Programs need to know what code page to use in order to display the contents of (pre-Unicode) files correctly. If a program uses the wrong code page it may show text as mojibake.
    • The code page in use may differ between machines, so (pre-Unicode) files created on one machine may be unreadable on another.
    • Data is often improperly tagged with the code page, or not tagged at all, making determination of the correct code page to read the data difficult.
    • These Microsoft code pages differ to various degrees from some of the standards and other vendors’ implementations. This isn’t a Microsoft issue per se, as it happens to all vendors, but the lack of consistency makes interoperability with other systems unreliable in some cases.
    • The use of code pages limits the set of characters that may be used.
    • Characters expressed in an unsupported code page may be converted to question marks (?) or other replacement characters, or to a simpler version (such as removing accents from a letter). In either case, the original character may be lost.

    See also[edit]

    • AppLocale – a utility to run non-Unicode (code page-based) applications in a locale of the user’s choice.

    References[edit]

    1. ^ «Code Pages». 2016-03-07. Archived from the original on 2016-03-07. Retrieved 2021-05-26.
    2. ^ a b c «Glossary of Terms Used on this Site». December 8, 2018. Archived from the original on 2018-12-08. The term «ANSI» as used to signify Windows code pages is a historical reference, but is nowadays a misnomer that continues to persist in the Windows community. The source of this comes from the fact that the Windows code page 1252 was originally based on an ANSI draft—which became International Organization for Standardization (ISO) Standard 8859-1. «ANSI applications» are usually a reference to non-Unicode or code page–based applications.
    3. ^ «Character Sets». www.iana.org. Archived from the original on 2021-05-25. Retrieved 2021-05-26.
    4. ^ «Extensible Markup Language (XML) 1.1 (Second Edition): Character encodings». W3C. 29 September 2006. Archived from the original on 19 April 2021. Retrieved 5 October 2020.
    5. ^ hylom (2017-11-14). «Windows 10のInsider PreviewでシステムロケールをUTF-8にするオプションが追加される» [The option to make UTF-8 the system locale added in Windows 10 Insider Preview]. スラド (in Japanese). Archived from the original on 2018-05-11. Retrieved 2018-05-10.
    6. ^ «Character Sets». IANA. Archived from the original on 2016-12-03. Retrieved 2019-04-07.
    7. ^ Microsoft. «Windows 1250». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    8. ^ IBM. «SBCS code page information document CPGID 01250». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    9. ^ Microsoft. «Windows 1251». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    10. ^ IBM. «SBCS code page information document CPGID 01251». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    11. ^ Microsoft. «Windows 1252». Archived from the original on 2013-05-04. Retrieved 2014-07-06.
    12. ^ IBM. «SBCS code page information document CPGID 01252». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    13. ^ Microsoft. «Windows 1253». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    14. ^ IBM. «SBCS code page information document CPGID 01253». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    15. ^ Microsoft. «Windows 1254». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    16. ^ IBM. «SBCS code page information document CPGID 01254». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    17. ^ Microsoft. «Windows 1255». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    18. ^ IBM. «SBCS code page information document CPGID 01255». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    19. ^ Microsoft. «Windows 1256». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    20. ^ IBM. «SBCS code page information document CPGID 01256». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    21. ^ Microsoft. «Windows 1257». Archived from the original on 2013-03-16. Retrieved 2014-07-06.
    22. ^ IBM. «SBCS code page information document CPGID 01257». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    23. ^ Microsoft. «Windows 1258». Archived from the original on 2013-10-25. Retrieved 2014-07-06.
    24. ^ IBM. «SBCS code page information document CPGID 01258». Archived from the original on 2014-07-14. Retrieved 2014-07-06.
    25. ^ IBM. «SBCS code page information document — CPGID 00437». Archived from the original on 2016-06-09. Retrieved 2014-07-04.
    26. ^ «IBM-943 and IBM-932». IBM Knowledge Center. IBM. Archived from the original on 2018-08-18. Retrieved 2020-07-08.
    27. ^ «Converter Explorer: ibm-1373_P100-2002». ICU Demonstration. International Components for Unicode. Archived from the original on 2021-05-26. Retrieved 2020-06-27.
    28. ^ «Coded character set identifiers – CCSID 5471». IBM Globalization. IBM. Archived from the original on 2014-11-29.
    29. ^ Julliard, Alexandre. «dump_krwansung_codepage: build Korean Wansung table from the KSX1001 file». make_unicode: Generate code page .c files from ftp.unicode.org descriptions. Wine Project. Archived from the original on 2021-05-26. Retrieved 2021-03-14.
    30. ^ IBM. «SBCS code page information document — CPGID 00037». Archived from the original on 2014-07-14. Retrieved 2014-07-04.
    31. ^ Steele, Shawn (2005-09-12). «Code Page 21027 «Extended/Ext Alpha Lowercase»«. MSDN. Archived from the original on 2019-04-06. Retrieved 2019-04-06.
    32. ^ a b c d e «Code Page Identifiers». docs.microsoft.com. Archived from the original on 2019-04-07. Retrieved 2019-04-07.
    33. ^ a b c d e «Code Page Identifiers». Microsoft Developer Network. Microsoft. 2014. Archived from the original on 2016-06-19. Retrieved 2016-06-19.
    34. ^ a b c d e «Web Encodings — Internet Explorer — Encodings». WHATWG Wiki. 2012-10-23. Archived from the original on 2016-06-20. Retrieved 2016-06-20.
    35. ^ Foller, Antonin (2014) [2011]. «Western European (IA5) encoding — Windows charsets». WUtils.com — Online web utility and help. Motobit Software. Archived from the original on 2016-06-20. Retrieved 2016-06-20.
    36. ^ Foller, Antonin (2014) [2011]. «German (IA5) encoding – Windows charsets». WUtils.com – Online web utility and help. Motobit Software. Archived from the original on 2016-06-20. Retrieved 2016-06-20.
    37. ^ Foller, Antonin (2014) [2011]. «Swedish (IA5) encoding — Windows charsets». WUtils.com — Online web utility and help. Motobit Software. Archived from the original on 2016-06-20. Retrieved 2016-06-20.
    38. ^ Foller, Antonin (2014) [2011]. «Norwegian (IA5) encoding — Windows charsets». WUtils.com — Online web utility and help. Motobit Software. Archived from the original on 2016-06-20. Retrieved 2016-06-20.
    39. ^ Foller, Antonin (2014) [2011]. «US-ASCII encoding — Windows charsets». WUtils.com — Online web utility and help. Motobit Software. Archived from the original on 2016-06-20. Retrieved 2016-06-20.
    40. ^ Nechayev, Valentin (2013) [2001]. «Review of 8-bit Cyrillic encodings universe». Archived from the original on 2016-12-05. Retrieved 2016-12-05.

    External links[edit]

    • National Language Support (NLS) API Reference. Table showing ANSI and OEM codepages per language (from web-archive since Microsoft removed the original page)
    • IANA Charset Name Registrations
    • Unicode mapping table for Windows code pages
    • Unicode mappings of windows code pages with «best fit»

    Кодировка текста – это схема нумерации символов, в которой каждому символу, цифре или знаку присвоено соответствующее число. Кодировку используют для сохранения и обработки текста на компьютере. Каждый раз при сохранении текста в файл он сохраняется с использованием определенной схемы кодирования, и при открытии этого файла необходимо использовать такую же схему, иначе восстановить исходный текст не получится. Самыми популярными кодировками для кириллицы сейчас являются UTF-8, Windows-1251 (CP1251, ANSI).

    Для того чтобы программа смогла правильно открыть текстовый файл, иногда приходится вручную менять кодировку, перекодируя текст из одной схемы в другую. Например, не редко возникают проблемы с открытием файлов CSV, XML, SQL, TXT, PHP.

    В этой небольшой статье мы расскажем о том, как изменить кодировку текстового файла на UTF-8, Windows-1251 или любую другую.

    Блокнот Windows

    Если вы используете операционную систему Windows 10 или Windows 11, то вы можете изменить кодировку текста с помощью стандартной программы Блокнот. Для этого нужно открыть текстовый файл с помощью Блокнота и воспользоваться меню «Файл – Сохранить как».

    меню Файл – Сохранить как

    В открывшемся окне нужно указать новое название для файла, выбрать подходящую кодировку и нажать на кнопку «Сохранить».

    изменить кодировку в Блокноте

    К сожалению, для подобных задач программа Блокнот часто не подходит. С ее помощью нельзя открывать документы большого размера, и она не поддерживает многие кодировки. Например, с помощью Блокнота нельзя открыть текстовые файлы в DOS 866.

    Notepad++

    Notepad++ (скачать) является одним из наиболее продвинутых текстовых редакторов. Он обладает подсветкой синтаксиса языков программирования, позволяет выполнять поиск и замену по регулярным выражениям, отслеживать изменения в файлах, записывать и воспроизводить макросы, считать хеш-сумы и многое другое. Одной из основных функций Notepad++ является поддержка большого количества кодировок текста и возможность изменения кодировки текстового файла в UTF-8 или Windows 1251.

    Для того чтобы изменить кодировку текста с помощью Notepad++ файл нужно открыть в данной программе. Если программа не смогла правильно определить схему кодирования текста, то это можно сделать вручную. Для этого нужно открыть меню «Кодировки – Кириллица» и выбрать нужный вариант.

    выбрать кодировку в Notepad++

    После открытия текста можно изменить его кодировку. Для этого нужно открыть меню «Кодировки» и выбрать один из вариантов преобразования. Notepad++ позволяет изменить текущую кодировку текста на ANSI (Windows-1251), UTF-8, UTF-8 BOM, UTF-8 BE BOM, UTF-8 LE BOM.

    изменить кодировку в Notepad++

    После преобразования файл нужно сохранить с помощью меню «Файл – Сохранить» или комбинации клавиш Ctrl-S.

    Akelpad

    Akelpad (скачать) – достаточно старая программа для работы с текстовыми файлами, которая все еще актуальна и может быть полезной. Фактически Akelpad является более продвинутой версией стандартной программы Блокнот из Windows. С его помощью можно открывать текстовые файлы большого размера, которые не открываются в Блокноте, выполнять поиск и замену с использованием регулярных выражений и менять кодировку текста.

    Для того чтобы изменить кодировку текста с помощью Akelpad файл нужно открыть в данной программе. Если после открытия файла текст не читается, то нужно воспользоваться меню «Файл – Открыть».

    открыть файл в Akelpad

    В открывшемся окне нужно выделить текстовый файл, снять отметку «Автовыбор» и выбрать подходящую кодировку из списка. При этом в нижней части окна можно видеть, как будет отображаться текст.

    выбрать кодировку в Akelpad

    Для того чтобы изменить текущую кодировку текста нужно воспользоваться меню «Файл – Сохранить как» и сохранить документ с указанием новой схемы кодирования.

    изменить кодировку в Akelpad

    В отличие от Notepad++, текстовый редактор Akelpad позволяет сохранить файл в практически любой кодировке. В частности, доступны Windows 1251, DOS 886, UTF-8 и многие другие.

    Посмотрите также:

    • Чем открыть PDF файл в Windows 7 или Windows 10
    • Как перевернуть страницу в Word
    • Как копировать текст с помощью клавиатуры
    • Как сделать рамку в Word
    • Как сделать буклет в Word

    Автор
    Александр Степушин

    Создатель сайта comp-security.net, автор более 2000 статей о ремонте компьютеров, работе с программами, настройке операционных систем.

    Остались вопросы?

    Задайте вопрос в комментариях под статьей или на странице
    «Задать вопрос»
    и вы обязательно получите ответ.

    Время на прочтение
    9 мин

    Количество просмотров 29K

    Введение

    Консольные приложения до сих пор остаются наиболее востребованным видом приложений, большинство разработчиков оттачивают архитектуру и бизнес-логику именно в консоли. При этом они нередко сталкиваются с проблемой локализации — русский текст, который вполне адекватно отражается в исходном файле, при выводе на консоль приобретает вид т.н. «кракозябр».

    В целом, локализация консоли Windows при наличии соответствующего языкового пакета не представляется сложной. Тем не менее, полное и однозначное решение этой проблемы, в сущности, до сих пор не найдено. Причина этого, главным образом, кроется в самой природе консоли, которая, являясь компонентом системы, реализованным статическим классом System.Console, предоставляет свои методы приложению через системные программы-оболочки, такие как командная строка или командный процессор (cmd.exe), PowerShell, Terminal и другие.
    По сути, консоль находится под двойным управлением — приложения и оболочки, что является потенциально конфликтной ситуацией, в первую очередь в части использования кодировок.

    Данный материал не предлагает строгий алгоритм действий, а направлен на описание узловых проблем, с которыми неизбежно сталкивается разработчик локализованного консольного приложения, а также некоторые возможные пути их разрешения. Предполагается, что это позволит разработчику сформировать стратегию работы с локализованной консолью и эффективно реализовать существующие технические возможности, большая часть которых хорошо описана и здесь опущена.

    Виды консолей

    В общем случае функции консоли таковы:

    • управление операционной системой и системным окружением приложений на основе применения стандартных системных устройств ввода-вывода (экран и клавиатура), использования команд операционной системы и/или собственно консоли;

    • запуск приложений и обеспечение их доступа к стандартным потокам ввода-вывода системы, также с помощью стандартных системных устройств ввода-вывода.

    Основная консоль Windows — командная строка или иначе командный процессор (CMD). Большие возможности предоставляют оболочки PowerShell (PS), Windows PowerShell (WPS) и Terminal. По умолчанию Windows устанавливает Windows Power Shell мажорной версией до 5, однако предлагает перейти на новую версию — 7-ку, имеющую принципиальное отличие (вероятно, начинающееся с 6-ки) — кроссплатформенность. Terminal — также отдельно уставливаемое приложение, по сути интегратор всех ранее установленных оболочек PowerShell и командной строки.

    Отдельным видом консоли можно считать консоль отладки Visual Studio (CMD-D).

    Конфликт кодировок

    Полностью локализованная консоль в идеале должна поддерживать все мыслимые и немыслимые кодировки приложений, включая свои собственные команды и команды Windows, меняя «на лету» кодовые страницы потоков ввода и вывода. Задача нетривиальная, а иногда и невозможная — кодовые страницы DOS (CP437, CP866) плохо совмещаются с кодовыми страницами Windows и Unicode.

    История кодировок здесь: О кодировках и кодовых страницах / Хабр (habr.com)

    Исторически кодовой страницей Windows является CP1251 (Windows-1251, ANSI, Windows-Cyr), уверенно вытесняемая 8-битной кодировкой Юникода CP65001 (UTF-8, Unicode Transformation Format), в которой выполняется большинство современных приложений, особенно кроссплатформенных. Между тем, в целях совместимости с устаревшими файловыми системами, именно в консоли Windows сохраняет базовые кодировки DOS — CP437 (DOSLatinUS, OEM) и русифицированную CP866 (AltDOS, OEM).

    Совет 1. Выполнять разработку текстовых файлов (программных кодов, текстовых данных и др.) исключительно в кодировке UTF-8. Мир любит Юникод, а кроссплатформенность без него вообще невозможна.

    Совет 2. Периодически проверять кодировку, например в текстовом редакторе Notepad++. Visual Studio может сбивать кодировку, особенно при редактировании за пределами VS.

    Поскольку в консоли постоянно происходит передача управления от приложений к собственно командному процессору и обратно, регулярно возникает «конфликт кодировок», наглядно иллюстрируемый таблица 1 и 2, сформированных следующим образом:

    Были запущены три консоли — CMD, PS и WPS. В каждой консоли менялась кодовая страница с помощью команды CHCP, выполнялась команда Echo c двуязычной строкой в качестве параметра (табл. 1), а затем в консоли запускалось тестовое приложение, исходные файлы которого были созданы в кодировке UTF-8 (CP65001): первая строка формируется и направляется в поток главным модулем, вторая вызывается им же, формируется в подключаемой библиотеке классов и направляется в поток опять главным модулем, третья строка полностью формируется и направляется в поток подключаемой библиотекой.

    Команды и код приложения под катом

    команды консоли:

    • > Echo ffffff фффффф // в командной строке

    • PS> Echo ffffff фффффф // в PowerShell

    • PS> Echo ffffff ?????? // так выглядит та же команда в Windows PowerShell

    код тестового приложения:

    using System;
    using ova.common.logging.LogConsole;
    using Microsoft.Extensions.Logging;
    using ova.common.logging.LogConsole.Colors;
    
    namespace LoggingConsole.Test
    {
        partial class Program
        {
            static void Main2(string[] args)
            {
                ColorLevels.ColorsDictionaryCreate();
                Console.WriteLine("Hello World! Привет, мир!");     //вывод строки приветствия на двух языках
                LogConsole.Write("Лог из стартового проекта", LogLevel.Information);
                Console.WriteLine($"8. Active codepage: input {Console.InputEncoding.CodePage}, output {Console.OutputEncoding.CodePage}");
                Console.ReadKey();
            } 
        }
    }

    Командную часть задания все консоли локализовали практически без сбоев во всех кодировках, за исключением: в WPS неверно отображена русскоязычная часть команды во всех кодировках.

    Табл. 1. Результат выполнения команды консоли Echo ffffff фффффф

    Табл. 1. Результат выполнения команды консоли Echo ffffff фффффф

    Вывод тестового приложения локализован лишь в 50% испытаний, как показано в табл.2.

    Табл. 2. Результат запуска приложения LoggingConsole.Test

    Табл. 2. Результат запуска приложения LoggingConsole.Test

    Сoвет 3. Про PowerShell забываем раз и навсегда. Ну может не навсегда, а до следующей мажорной версии…

    По умолчанию Windows устанавливает для консоли кодовые страницы DOS. Чаще всего CP437, иногда CP866. Актуальные версии командной строки cmd.exe способны локализовать приложения на основе русифицированной кодовой страницы 866, но не 437, отсюда и изначальный конфликт кодировок консоли и приложения. Поэтому

    Совет 4. Перед запуском приложения необходимо проверить кодовую страницу консоли командой CHCP и ей же изменить кодировку на совместимую — 866, 1251, 65001.

    Совет 5. Можно установить кодовую страницу консоли по умолчанию. Кратко: в разделе реестра \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor добавить или изменить значение параметра Autorun на: chcp <номер кодовой страницы>. Очень подробно здесь: Изменить кодовую страницу консоли Windows по умолчанию на UTF-8 (qastack.ru), оригинал на английском здесь: Change default code page of Windows console to UTF-8.

    Проблемы консолей Visual Studio

    В Visual Studio имеется возможность подключения консолей, по умолчанию подключены командная строка для разработчика и Windows PowerShell для разработчика. К достоинствам можно отнести возможности определения собственных параметров консоли, отдельных от общесистемных, а также запуск консоли непосредственно в директории разработки. В остальном — это обычные стандартные консоли Windows, включая, как показано ранее, установленную кодовую страницу по умолчанию.

    Отдельной опцией Visual Studio является встроенная односеансная консоль отладки, которая перехватывает команду Visual Studio на запуск приложения, запускается сама, ожидает компиляцию приложения, запускает его и отдает ему управление. Таким образом, отладочная консоль в течение всего рабочего сеанса находится под управлением приложения и возможность использования команд Windows или самой консоли, включая команду CHCP, не предусмотрена. Более того, отладочная консоль не воспринимает кодовую страницу по умолчанию, определенную в реестре, и всегда запускается в кодировке 437 или 866.

    Совет 6. Тестирование приложения целесообразно выполнять во внешних консолях, более дружелюбных к локализации.

    Анализ проблем консолей был бы не полон без ответа на вопрос — можно ли запустить консольное приложение без консоли? Можно — любой файл «.exe» запустится двойным кликом, и даже откроется окно приложения. Однако консольное приложение, по крайней мере однопоточное, по двойному клику запустится, но консольный режим не поддержит — все консольные вводы-выводы будут проигнорированы, и приложение завершится

    Локализация отладочной консоли Visual Studio

    Отладочная консоль — наиболее востребованная консоль разработчика, гораздо более удобная, чем внешняя консоль, поэтому резонно приложить максимум усилий для ее локализации.

    На самом деле, правильнее говорить о локализации приложения в консоли — это важное уточнение. Microsoft по этому поводу высказывается недвусмысленно: «Programs that you start after you assign a new code page use the new code page. However, programs (except Cmd.exe) that you started before assigning the new code page will continue to use the original code page». Иными словами, консоль можно локализовать когда угодно и как угодно, но приложение будет локализовано в момент стабилизации взаимодействия с консолью в соответствии с текущей локализацией консоли, и эта локализация сохранится до завершения работы приложения. В связи с этим возникает вопрос — в какой момент окончательно устанавливается связь консоли и приложения?

    Важно! Приложение окончательно стабилизирует взаимодействие с консолью в момент начала ввода-вывода в консоль, благодаря чему и появляется возможность программного управления локализацией приложения в консоли — до первого оператора ввода-вывода.

    Ниже приведен пример вывода тестового приложения в консоль, иллюстрирующий изложенное. Метод Write получает номера текущих страниц, устанавливает новые кодовые страницы вводного и выводного потоков, выполняет чтение с консоли и записывает выводную строку, содержащий русский текст, в том числе считанный с консоли, обратно в консоль. Операция повторяется несколько раз для всех основных кодовых страниц, упомянутых ранее.

    F:\LoggingConsole.Test\bin\Release\net5.0>chcp
    Active code page: 1251
    
    F:\LoggingConsole.Test\bin\Release\net5.0>loggingconsole.test
    Codepages: current 1251:1251, setted 437:437, ΓΓεΣΦ∞ 5 ±Φ∞ΓεδεΓ ∩ε-≡≤±±ΩΦ: Θ÷≤Ωσ=Θ÷≤Ωσ
    Codepages: current 437:437, setted 65001:65001,  5  -: =
    Codepages: current 65001:65001, setted 1252:1252, ââîäèì 5 ñèìâîëîâ ïî-ðóññêè: éöóêå=éöóêå
    Codepages: current 1252:1252, setted 1251:1251, вводим 5 символов по-русски: йцуке=йцуке
    Codepages: current 1251:1251, setted 866:866, ттюфшь 5 ёшьтюыют яю-Ёєёёъш: щЎєъх=щЎєъх
    Codepages: current 866:866, setted 1251:1251, вводим 5 символов по-русски: йцуке=йцуке
    Codepages: current 1251:1251, setted 1252:1252, ââîäèì 5 ñèìâîëîâ ïî-ðóññêè: éöóêå=éöóêå
    
    F:\LoggingConsole.Test\bin\Release\net5.0>chcp
    Active code page: 1252
    • приложение запущено в консоли с кодовыми страницами 1251 (строка 2);

    • приложение меняет кодовые страницы консоли (current, setted);

    • приложение остановлено в консоли с кодовыми страницами 1252 (строка 11, setted);

    • по окончании работы приложения изменения консоли сохраняются (строка 14 — Active codepage 1252);

    • Приложение адекватно локализовано только в случае совпадения текущих кодовых страниц консоли (setted 1251:1251) с начальными кодовыми страницами (строки 8 и 10).

    Код тестового приложения под катом

    using System;
    using System.Runtime.InteropServices;
    
    namespace LoggingConsole.Test
    {
        partial class Program
        {
            [DllImport("kernel32.dll")] static extern uint GetConsoleCP();
            [DllImport("kernel32.dll")] static extern bool SetConsoleCP(uint pagenum);
            [DllImport("kernel32.dll")] static extern uint GetConsoleOutputCP();
            [DllImport("kernel32.dll")] static extern bool SetConsoleOutputCP(uint pagenum);
            
            static void Main(string[] args)
            {
                Write(437);
                Write(65001);
                Write(1252);
                Write(1251);
                Write(866);
                Write(1251);
                Write(1252);
             }
    
            static internal void Write(uint WantedIn, uint WantedOut)
            {
                uint CurrentIn = GetConsoleCP();
                uint CurrentOut = GetConsoleOutputCP();
                Console.Write($"current {CurrentIn}:{CurrentOut} - текущая кодировка, "); /*wanted {WantedIn}:{WantedOut},*/
                SetConsoleCP(WantedIn);
                SetConsoleOutputCP(WantedOut);
                Console.Write($"setted {GetConsoleCP()}:{GetConsoleOutputCP()} - новая кодировка, ");
                Console.Write($"вводим 3 символа по-русски: ");
                string str = "" + Console.ReadKey().KeyChar.ToString();
                str += Console.ReadKey().KeyChar.ToString();
                str += Console.ReadKey().KeyChar.ToString();
                Console.WriteLine($"={str}");
            }
          
            static internal void Write(uint ChangeTo)
            {
                Write(ChangeTo, ChangeTo);
            }
        }
    }
    

    Программное управление кодировками консоли — это единственный способ гарантированной адекватной локализацией приложения в консоли. Языки .Net такой возможности не предоставляют, однако предоставляют функции WinAPI: SetConsoleCP(uint numcp) и SetConsoleOutputCP(uint numcp), где numcp — номер кодовой страницы потоков ввода и вывода соответственно. Подробнее здесь: Console Functions — Windows Console | Microsoft Docs. Пример применения консольных функций WInAPI можно посмотреть в тестовом приложении под катом выше.

    Совет 7. Обязательный и повторный! Функции SetConsoleCP должны размещаться в коде до первого оператора ввода-вывода в консоль.

    Стратегия локализации приложения в консоли

    1. Удалить приложение PowerShell (если установлено), сохранив Windows PowerShell;

    2. Установить в качестве кодовую страницу консоли по умолчанию CP65001 (utf-8 Unicode) или CP1251 (Windows-1251-Cyr), см. совет 5;

    3. Разработку приложений выполнять в кодировке utf-8 Unicode;

    4. Контролировать кодировку файлов исходных кодов, текстовых файлов данных, например с помощью Notepad++;

    5. Реализовать программное управление локализацией приложения в консоли, пример ниже под катом:

    Пример программной установки кодовой страницы и локализации приложения в консоли

    using System;
    using System.Runtime.InteropServices;
    
    namespace LoggingConsole.Test
    {
        partial class Program
        {
          	static void Main(string[] args)
            {
              	[DllImport("kernel32.dll")] static extern bool SetConsoleCP(uint pagenum);
            		[DllImport("kernel32.dll")] static extern bool SetConsoleOutputCP(uint pagenum);
                SetConsoleCP(65001);        //установка кодовой страницы utf-8 (Unicode) для вводного потока
                SetConsoleOutputCP(65001);  //установка кодовой страницы utf-8 (Unicode) для выводного потока
     
                Console.WriteLine($"Hello, World!");
            }
        }
    }
    

    Здравствуйте, уважаемые читатели моего блога. Сегодня мы поговорим с вами про кодировку. Если вы читали мою статью о том, как посмотреть код страницы в браузере, то знаете, что любой документ в интернете хранится не в том виде, в каком мы привыкли его видеть. Он записан при помощи непонятных человеку символов и знаков. С текстом все точно также.

    Существует несколько кодировок, а потому, иногда увидев непонятные символы при открытии книги в мобильном приложении или запилив статью на сайт, вы, поменяв кое-какие значения в настройках, увидите привычный глазу алфавит.

    Кодировки UTF-8 и Windows 1251 - просто о сложном

    Кодировка windows-1251 – что это такое, какое значение она имеет при создании сайта, какие символы будут доступны и является ли она лучшим решением на сегодняшний день? Обо всем этом в сегодняшней статье. Как всегда, простым языком, максимально понятно и с минимальным количеством терминов.

    Немного теории

    Любой документ на компьютере или в интернете, как я уже сказал, хранится в виде двоичного кода. К примеру, если вы используете кодировку ASCII, то буква «К» будет записана как 10001010, а windows 1251 под этим числом скрывается символ – Љ. В итоге, если браузер или программа обратится к другой таблице и считает вместо ASCII коды windows 1251, то читатель увидит совершенно непонятные ему символ.

    Логичен вопрос, нафига было придумывать множество таблиц с кодами? Дело в том, что помимо русского алфавита существует еще и английский, немецкий, китайский. По некоторым подсчетам, существует около 200 000 символов. Хотя, я не очень доверяю этой статистике, вспоминая про японский.

    Не забывайте, что для заглавной и строчной буквы нужно придумать свой код, есть запятые, тире и так далее.

    Чем больше в таблице символов, тем длиннее код каждого из них, а значит и вес документа становится больше.

    Кодировки UTF-8 и Windows 1251 - просто о сложном

    Представьте, если бы одна книга весила 4 Гб! Она бы очень долго загружалась, занимала все свободное место на компьютере. Решение о скачивании представлялось бы делом нелегким.

    Если вспомнить о сайтах, то вообще страшно подумать, что бы произошло. Каждая страничка открывалась даже на скоростном оптоволокне по часу с лишним! Думаю, мобильные телефоны можно было бы смело выкидывать. Пользоваться ими на улице даже с 4G? Сомневаюсь.

    По этим причинам каждый программист в свое время старался придумать свою таблицу символов. Чтобы было удобно для использования и вес сохранялся оптимальным.

    Microsoft, к примеру, для русскоязычного сегмента создали windows-1251. В ней, конечно же, есть свои достоинства и недостатки. Как и у любого другого продукта.

    Сейчас уже, лишь 2% всех страниц в интернете написано на 1251. Большинство веб-мастеров используют UTF-8. Почему так?

    Недостатки и достоинства

    UTF-8, в отличие от windows-1251 универсальная кодировка, в ней содержатся буквы различных алфавитов. Существует даже UTF-128, где есть вообще все языки – теулу, суахили, лаосский, мальтийский и так далее.

    Кодировки UTF-8 и Windows 1251 - просто о сложном

    UTF-8 победнее, буквы занимают в разы меньше места и занимают всего один байт памяти, как и в 1251. В УТФ есть редкие символы из других языков или специальные символы. Они-то и весят по 5-6 байтов, но в документе используются крайне редко.

    Эта кодировка более продумана, а потому ее использует большинство приложений по умолчанию. То есть, если вы не указываете программе, какую кодировку вы используете, то первым делом он проверит именно UTF-8 .

    Когда вы создаете html документ для сайта, то указываете браузерам на какую таблицу им обращать внимание при расшифровке записей.

    Для этого необходимо вставить в тег head следующие данные. После символов «charset=» идет либо утф, либо виндовс, как в примере ниже.

    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

    Кодировки UTF-8 и Windows 1251 - просто о сложном

    Если в дальнейшем вы захотите что-то поменять и вставить фразу на албанском, используя эту таблицу расшифровок, то ничего не получится, ведь этого языка кодировка не поддерживает. UTF‑8 без проблем позволит вам это сделать.

    Если вас заинтересовало правильное создание сайта, то я могу порекомендовать вам курс Михаила Русакова «Создание и Раскрутка сайта от А до Я».

    Создание и раскрутка сайта от А до Я

    Он содержит в себе очень много – 256 уроков, затрагивающих HTML, CSS, JavaScript, PHP, MySQL и XML. Помимо языков программирования вы сможете понять как монетизировать сайт, то есть скорее и больше получать прибыль. Один из немногих курсов, в котором было бы так подробно разъяснено все, что нужно.

    Сам я вот уже год обучаюсь в школе блоггеров Александра Борисова. Это занимает в разы больше времени, конца и края пока не видно, но зато не менее исчерпывающе и дисциплинирует. Мотивирует продолжать разработку.

    Ну а если возникают вопросы, не нужно искать по интернету. Всегда есть грамотный наставник.

    Школа блоггеров Александра Борисова

    Что-то я отошел от темы. Давайте вернемся к кодировкам.

    Базы банных

    Когда речь идет о php, все вообще страшно. Я уже рассказывал про базы данных, они используются для ускорения работы сайта. Обычно, вы к ним не обращаетесь, но когда появляется необходимость в переносе сайта становится не по себе.

    Сложности случаются у всех, не важно какой у вас опыт работы, стаж и выслуга лет. Некоторые странички в базе могут содержать в себе все доступные символы для виндовс-1251, другие, к примеру, в шаблонах страниц, в другой кодировке.

    Пока не нужен перенос все работает и функционирует, хоть и не совсем правильно. Но после переезда начинаются неприятности. В идеале вы должны использовать либо только УТФ, либо виндовс-1251, но по факту всегда и у всех случаются вот такие недочеты.

    Чтобы расшифровка согласовалась необходимо вписать код mysql_query(«SET NAMES cp1251»). В этом случае преобразование будет осуществлять по другому протоколу – cp1251.

    Кодировки UTF-8 и Windows 1251 - просто о сложном

    Htaccess

    Если на сайте вы настойчиво решили использовать именно 1251, то вам следует найти или создать файл htaccess. Он отвечает за настройки конфигурации. В него придется добавить еще три строчки, чтобы все сошлось.

    DefaultLanguage ru;
    AddDefaultCharset windows-1251;
    php_value default_charset "cp1251"

    Я все же настоятельно рекомендую вам задумать о использовании UTF-8. Он более популярен, прост и богат. Какие бы решения вы не приняли сейчас, важно, чтобы впоследствии можно было все исправить. Добавить англоязычную версию сайта на этой кодировке будет в разы проще. Ничего не нужно исправлять.

    Решение остается за вами. Подписывайтесь на рассылку, чтобы узнавать как можно быстрее создавать правильные сайты, где учиться, чтобы не повторять чужих ошибок, а также какие блоггеры получают больше посетителей.

    До новых встреч и удачи в ваших начинаниях.

  • Кодировка windows 1251 в python
  • Кодировка windows 1251 в linux
  • Кодирование windows pcm без сжатия
  • Кодеки для windows 7 x64 последняя версия
  • Кодеки для windows 10 что это