Как преобразовать строку в кодировку windows 1251

Кодировка текста – это схема нумерации символов, в которой каждому символу, цифре или знаку присвоено соответствующее число. Кодировку используют для

Содержание

  1. Как изменить кодировку текстового файла на UTF-8 или Windows 1251
  2. Блокнот Windows
  3. Notepad++
  4. Akelpad
  5. Как преобразовать utf 8 в windows 1251
  6. Интересные решения Perl. Вопросы и ответы
  7. Как конвертировать строку из UTF-8 в Windows-1251?
  8. Комментарии посетителей сайта
  9. Как преобразовать utf 8 в windows 1251
  10. Заметки Лёвика
  11. web программирование, администрирование и всякая всячина, которая может оказаться полезной
  12. Если не работает iconv
  13. iconv array для массива
  14. Как сменить кодировку файла? Notepad++ редактор с подсветкой синтаксиса, кодировка Utf-8 без BOM
  15. Чем вообще хорош этот редактор?

Как изменить кодировку текстового файла на UTF-8 или Windows 1251

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

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

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

Блокнот Windows

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

082621 0816 1

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

082621 0816 2

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

Notepad++

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

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

082621 0816 3

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

082621 0816 4

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

Akelpad

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

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

082621 0816 5

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

082621 0816 6

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

082621 0816 7

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

Источник

Как преобразовать utf 8 в windows 1251

n 181 s

Интересные решения Perl. Вопросы и ответы

Как конвертировать строку из UTF-8 в Windows-1251?

Есть как минимум 4 варианта:

1. Написать собственную процедуру перекодировки.
В этом случае придется потратить время на изучение алгоритмов.

2. Можно использовать модуль Convert::Cyrillic, однако он испытывает зависимость от модуля Unicode::Map8, который легко установить под *nix, но с поиском модуля под ActiveState Perl 5.8 могут возникнуть проблемы.

3. Можно использовать модуль Text::Iconv, который доступен как для Perl 5.6, так и для Perl 5.8.

4. Если Вы используете Perl 5.8, то конвертирование можно прозвести с помощью Encode:

Опубликовано: 19 ноября 2005 года.

Комментарии посетителей сайта

Григорий 03.08.2016 17:20

Отлично. Ничего лишнего и всё понятно. Спасибо!

Дмитрий 25.01.2012 15:46

Спасибо, за хороший пример и пояснения!

Андрей 25.05.2011 00:43
Действительно. Четвертый метод сработал. Спасибо.

Есть ли способ для конвертации массива, например,
Encode::from_to(@var_arr, ‘windows-1251’, ‘utf-8’);

Пытался использовать
use open OUT => ‘:utf8’;
use open ‘:utf8’;

но ничего не вышло.

Ответ: 07.09.2006 20:20
Для массива используйте функцию map или же обыкновенный цикл.

Валерий 05.09.2006 04:14
кстати, может есть какой-нибудь вариант вывода perl’ом в браузер текста в UTF-8 без использования модулей Unicode и Text::Iconv. например, с использованием модуля CGI.

и почему не помогает вывод заголовка?
print «Content-type: text/html; charset=utf-8

Источник

Как преобразовать utf 8 в windows 1251

Сообщения: 3665
Благодарности: 1562

» width=»100%» style=»BORDER-RIGHT: #719bd9 1px solid; BORDER-LEFT: #719bd9 1px solid; BORDER-BOTTOM: #719bd9 1px solid» cellpadding=»6″ cellspacing=»0″ border=»0″>

contributor

Сообщения: 27459
Благодарности: 8022

Сообщения: 3665
Благодарности: 1562

поясните плз, AFAIK utf16le (=Unicode) Native-кодировка начиная с Win2K

Источник

Заметки Лёвика

web программирование, администрирование и всякая всячина, которая может оказаться полезной

При помощи функции php iconv (строго говоря, это не совсем функция PHP, она использует стороннюю библиотеку (есть iconv.dll и php_iconv.dll или iconv.so), которой может не быть на хостинге) легко преобразовать кодировку (например, из windows-1251 в utf-8 и наоборот:

Если не работает iconv

Т.е. чтобы преобразовать текст из кодировки windows-1251 в UTF-8 следует выполнить:
mb_convert_encoding($s,»UTF-8″,»windows-1251″);

iconv array для массива

Метки: iconv

Опубликовано Пятница, Октябрь 21, 2011 в 15:02 в следующих категориях: Без рубрики. Вы можете подписаться на комментарии к этому сообщению через RSS 2.0. Вы можете оставить комментарий. Пинг отключен.

Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)

html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)

ссылка (для отправки по почте)

Как быть с запросом select к базе mssql не понимает кирилицу
“select
[Название]
,[номер]
, [Removed]
from imdb.dbo. Оконечное оборудование “;

Следует привести столбцы (или всю базу данных сразу) к соответствующему сравнению (кодировке)
ALTER DATABASE COLLATE Cyrillic_General_CI_AS

Или использовать Nvarchar

declare @test TABLE
(
Col1 varchar(40),
Col2 varchar(40),
Col3 nvarchar(40),
Col4 nvarchar(40)
)
INSERT INTO @test VALUES
(‘иытание’,N’иытание’,’иытание’,N’иытание’)
SELECT * FROM @test

Если изменяю версию php 5.6 то не перекодируется. Не подскажете?

Источник

Как сменить кодировку файла? Notepad++ редактор с подсветкой синтаксиса, кодировка Utf-8 без BOM

money birds728

notepad++ download

Notepad++ — отличный текстовый редактор!

В статье о кодировках текста я описал основные моменты, показывающие, почему необходимо учитывать кодировку файла (например, при создании html-страницы). Здесь же я опишу простой способ выставления нужной кодировки текста с помощью простого и быстрого редактора Notepad++.

Чтобы скачать данную программу, заходим на официальный сайт — Notepad-plus-plus.org — далее ищем ссылку «download», кликаем по ней и выбираем «Notepad++ v*** Installer», где вместо звёздочек будет текущая версия редактора. Скачиваем и устанавливаем, никаких сложностей при установке нет.

Чем вообще хорош этот редактор?

notepad++ highlight

Notepad++ понимает php и подсвечивает синтаксис языка. Кликабельно

Последняя особенность очень важна, например, при редактировании шаблонов движка вашего сайта (напр., WordPress). Почему? Потому что все файлы WP по умолчанию имеют кодировку Utf-8. Если менять их стандартным блокнотом Windows, то к кодировке Utf-8 добавляется специальная BOM-последовательность. Необязательно знать, что это такое, но из-за неё некоторые функции движка работать вообще не будут. Поэтому так важно, чтобы все файлы шаблонов WP были сохранены в кодировке Utf-8 без BOM.

notepad++ menu

Преобразование в кодировку Utf-8 без BOM

Теперь, чтобы открыть текстовый файл данным редактором, надо кликнуть по нему правой кнопкой мышки и выбрать соответствующий пункт меню:

Save as notepad++

Таким образом, установив на свой компьютер программу Notepad++ можно получить многофункциональный редактор текста с подсветкой синтаксиса и возможностью манипуляций с кодировками.

Спасибо! Хорошая статья. Утвердился в том, чтобы преобразовывать всегда на «без BOM», раньше постоянно мучился: «Что же использовать?». Ещё раз, спасибо.

Огромное спасибо.
Со своим сайд баром замучался, еще не финиш, но когда читаешь и видишь … Спасибо.. Звонок другу не понадобился… =)

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

а где скачать нормальный нотепад. чтобы без виросов всяких?

я, а чего вы с официального сайта не качаете? Там же без вирусов.

Источник

Adblock
detector» width=»100%» style=»BORDER-RIGHT: #719bd9 1px solid; BORDER-LEFT: #719bd9 1px solid; BORDER-BOTTOM: #719bd9 1px solid» cellpadding=»6″ cellspacing=»0″ border=»0″>

Проблема кодировок часто возникает при написании парсеров, чтении данных из xml и CSV файлов. Ниже представлены способы эту проблему решить.

1

windows-1251 в UTF-8

$text = iconv('windows-1251//IGNORE', 'UTF-8//IGNORE', $text);
echo $text;

PHP

$text = mb_convert_encoding($text, 'UTF-8', 'windows-1251');
echo $text;

PHP

2

UTF-8 в windows-1251

$text = iconv('utf-8//IGNORE', 'windows-1251//IGNORE', $text);
echo $text;

PHP

$text = mb_convert_encoding($text, 'windows-1251', 'utf-8');
echo $text;

PHP

3

Когда ни что не помогает

$text = iconv('utf-8//IGNORE', 'cp1252//IGNORE', $text);
$text = iconv('cp1251//IGNORE', 'utf-8//IGNORE', $text);
echo $text;

PHP

Иногда доходит до бреда, но работает:

$text = iconv('utf-8//IGNORE', 'windows-1251//IGNORE', $text);
$text = iconv('windows-1251//IGNORE', 'utf-8//IGNORE', $text);
echo $text;

PHP

4

File_get_contents / CURL

Бывают случаи когда file_get_contents() или CURL возвращают иероглифы (Алмазные борÑ) – причина тут не в кодировке, а в отсутствии BOM-метки.

$text = file_get_contents('https://example.com');
$text = "xEFxBBxBF" .  $text;
echo $text;

PHP

Ещё бывают случаи, когда file_get_contents() возвращает текст в виде:

�mw�Ƒ0�����&IkAI��f��j4/{�</�&�h�� ��({�񌝷o�����:/��<g���g��(�=�9�Paɭ

Это сжатый текст в GZIP, т.к. функция не отправляет правильные заголовки. Решение проблемы через CURL:

function getcontents($url){
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
	$output = curl_exec($ch);
	curl_close($ch);
	return $output;
}

echo getcontents('https://example.com');

PHP

12.01.2017, обновлено 02.11.2021

Другие публикации

Отправка письма с вложением

Отправка e-mail в кодировке UTF-8 с вложенными файлами и возможные проблемы.

Работа с JSON в PHP

JSON (JavaScript Object Notation) – текстовый формат обмена данными, основанный на JavaScript, который представляет собой набор пар {ключ: значение}. Значение может быть массивом, числом, строкой и…

Массив $_SERVER

Описание значений глобального массива $_SERVER с примерами.

Получить фото из Instagram без API

Так как Instagram и Fasebook ограничили доступ к API, а фото с открытого аккаунта всё же нужно периодически получать и…

Обзор PHP расширений для чтения файлов Excel

В статье представлены различные PHP-расширения для чтения файлов XLS, XLSX, описаны их плюсы и минусы, а также примеры…

Бот Телеграм на PHP

Примеры как зарегистрировать бота в Телеграм, описание и взаимодействие с основными методами API.

cpp

Преобразование кодировок

При использовании L-строк все символы кодируются двумя байтами. Не следует рассматривать L-строку, как строку в какой-то кодировке, например, в UTF-16. Думайте об L-строке как о строке в абстрактной кодировке, позволяющей закодировать более 65 тысяч символов. Когда мы говорим о строке в какой-либо кодировке, то мы всегда говорим о C-строке. По умолчанию для проекта мы настроили для C-строк кодировку windows-1251.

Используя функции mbstowcs() и wcstombs(), которые мы рассмотрели в предыдущем разделе, можно преобразовать строку из одной однобайтовой кодировки в другую. Кодировка символов C-строки указывается с помощью локали. В этом случае L-строка используется как промежуточная стадия. Преобразуем строку из кодировки windows-1251 в кодировку windows-866 (листинг 8.3).

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <clocale>
#include <cwchar>
#include <cstdlib>
#include <cstring>
#include <process.h>

int main() {
   size_t count = 0;
   char cp866[256] = {0};
   wchar_t wstr[256] = {0};
   char cp1251[] = "строка"; // Исходная строка (windows-1251)
   for (int i = 0, len = (int)std::strlen(cp1251); i < len; ++i) {
      std::cout << (int)cp1251[i] << ' ';
   } // -15 -14 -16 -18 -22 -32
   std::cout << std::endl;

   // Преобразование C-строки в кодировке windows-1251 в L-строку
   _wsetlocale(LC_ALL, L"Russian_Russia.1251");
   count = std::mbstowcs(wstr, cp1251, 255);
   if (count == (size_t)(-1)) {
      std::cout << "Error 1" << std::endl;
      exit(1);
   }
   for (int i = 0, len = (int)std::wcslen(wstr); i < len; ++i) {
      std::cout << (int)wstr[i] << ' ';
   } // 1089 1090 1088 1086 1082 1072
   std::cout << std::endl;

   // Преобразование L-строки в C-строку в кодировке windows-866
   _wsetlocale(LC_ALL, L"Russian_Russia.866");
   count = std::wcstombs(cp866, wstr, 255);
   if (count == (size_t)(-1)) {
      std::cout << "Error 2" << std::endl;
      exit(1);
   }
   for (int i = 0, len = (int)std::strlen(cp866); i < len; ++i) {
      std::cout << (int)cp866[i] << ' ';
   } // -31 -30 -32 -82 -86 -96
   std::cout << std::endl;
   return 0;
}

Для преобразования кодировок в Windows можно воспользоваться следующими функциями из WinAPI (кодировки указаны для русской версии Windows):

  • CharToOemA() — преобразует строку source в кодировке windows-1251 в строку dest в кодировке windows-866. Прототип функции:
#include <windows.h> /* User32.lib */
WINBOOL CharToOemA(LPCSTR source, LPSTR dest);
  • CharToOemBuffA() — преобразует строку source в кодировке windows-1251 в строку dest в кодировке windows-866. Количество символов указывается в параметре length. Прототип функции:
#include <windows.h> /* User32.lib */
WINBOOL CharToOemBuffA(LPCSTR source, LPSTR dest, DWORD length);
  • OemToCharA() — преобразует строку source в кодировке windows-866 в строку dest в кодировке windows-1251. Прототип функции:
#include <windows.h> /* User32.lib */
WINBOOL OemToCharA(LPCSTR source, LPSTR dest);
  • OemToCharBuffA() — преобразует строку source в кодировке windows-866 в строку dest в кодировке windows-1251. Количество символов указывается в параметре length. Прототип функции:
#include <windows.h> /* User32.lib */
WINBOOL OemToCharBuffA(LPCSTR source, LPSTR dest, DWORD length);

Пример использования функций CharToOemA() и OemToCharA() приведен в листинге 8.4.

#include <iostream>
#include <clocale>
#include <cstring>
#include <windows.h>

int main() {
   std::setlocale(LC_ALL, "Russian_Russia.1251");
   char cp866[256] = {0};
   char cp1251[256] = {0};
   char str[] = "строка"; // Исходная строка в кодировке windows-1251

   // Преобразование windows-1251 в windows-866
   CharToOemA(str, cp866);
   for (int i = 0, len = (int)std::strlen(cp866); i < len; ++i) {
      std::cout << (int)cp866[i] << ' ';
   } // -31 -30 -32 -82 -86 -96
   std::cout << std::endl;

   // Преобразование windows-866 в windows-1251
   OemToCharA(cp866, cp1251);
   for (int i = 0, len = (int)std::strlen(cp1251); i < len; ++i) {
      std::cout << (int)cp1251[i] << ' ';
   } // -15 -14 -16 -18 -22 -32
   std::cout << std::endl;
   return 0;
}

Для преобразования кодировок в Windows можно также воспользоваться следующими функциями из WinAPI:

  • MultiByteToWideChar() — преобразует C-строку lpMultiByteStr в L-строку lpWideCharStr. Прототип функции:
#include <windows.h> /* Kernel32.lib */
int MultiByteToWideChar(UINT codePage, DWORD dwFlags,
   LPCCH lpMultiByteStr, int cbMultiByte,
   LPWSTR lpWideCharStr, int cchWideChar);

Параметр codePage задает кодировку C-строки. Примеры указания кодировки: 866 (для кодировки windows-866), 1251 (для windows-1251), 65001 или CP_UTF8 (для UTF-8), 1200 (для UTF-16LE), 1201 (для UTF-16BE), 12000 (для UTF-32LE) и 12001 (для UTF-32BE). Полный список кодировок смотрите в документации.

В параметре dwFlags можно указать различные флаги (MB_PRECOMPOSED (1), MB_ERR_INVALID_CHARS (8), MB_COMPOSITE (2), MB_USEGLYPHCHARS (4)), задающие поведение функции при конверсии, или значение 0. Полный список и описание флагов смотрите в документации.

Параметр cbMultiByte задает количество байтов в C-строке lpMultiByteStr, подлежащих конверсии. Если C-строка завершается нулевым символом, то лучше указать значение –1. В этом случае размер строки вычисляется автоматически и в L-строку вставляется нулевой символ. Если указано конкретное число, то нулевой символ автоматически в L-строку не вставляется!

Параметр cchWideChar задает максимальный размер L-строки lpWideCharStr в символах. Если указать значение 0, то функция вернет требуемое количество символов. Если указано конкретное значение, то функция вернет количество записанных символов или значение 0 в случае ошибки;

  • WideCharToMultiByte() — преобразует L-строку lpWideCharStr в C-строку lpMultiByteStr. Требуемая кодировка C-строки указывается в параметре codePage. Прототип функции:
#include <windows.h> /* Kernel32.lib */
int WideCharToMultiByte(UINT codePage, DWORD dwFlags,
   LPCWCH lpWideCharStr, int cchWideChar,
   LPSTR lpMultiByteStr, int cbMultiByte,
   LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar);

В параметре dwFlags можно указать различные флаги (WC_COMPOSITECHECK (512), WC_DEFAULTCHAR (64), WC_DISCARDNS (16), WC_SEPCHARS (32), WC_NO_BEST_FIT_CHARS (1024)), задающие поведение функции при конверсии, или значение 0. Полный список и описание флагов смотрите в документации.

Параметр cchWideChar задает количество символов в L-строке lpWideCharStr, подлежащих конверсии. Если L-строка завершается нулевым символом, то лучше указать значение –1. В этом случае размер строки вычисляется автоматически и в C-строку вставляется нулевой символ. Если указано конкретное число, то нулевой символ автоматически в C-строку не вставляется!

Параметр cbMultiByte задает максимальный размер C-строки lpMultiByteStr в байтах. Если указать значение 0, то функция вернет требуемое количество байтов. Если указано конкретное значение, то функция вернет количество записанных байтов или значение 0 в случае ошибки.

В параметре lpDefaultChar можно задать адрес символа, который будет использоваться, если символ в L-строке не может быть преобразован (символ отсутствует в кодировке codePage). Если задан нулевой указатель, то будет использоваться символ по умолчанию. При использовании кодировки UTF-8 параметр lpDefaultChar должен иметь значение NULL.

Параметр lpUsedDefaultChar позволяет задать адрес логической переменной. Если параметр не равен значению NULL, то в переменную будет записано логическое значение Истина, если какого-либо символа нет в кодировке codePage, и 0 — в противном случае. При использовании кодировки UTF-8 параметр lpUsedDefaultChar должен иметь значение NULL.

Пример использования функций MultiByteToWideChar() и WideCharToMultiByte() приведен в листинге 8.5.

#include <iostream>
#include <clocale>
#include <cstring>
#include <cwchar>
#include <windows.h>

int main() {
   std::setlocale(LC_ALL, "Russian_Russia.1251");
   int count = 0;
   char cp866[256] = {0};
   char utf8[256] = {0};
   wchar_t wstr[256] = {0};
   wchar_t wstr2[256] = {0};
   char str[] = "строка str"; // Исходная строка (windows-1251)
   for (int i = 0, len = (int)std::strlen(str); i < len; ++i) {
      std::cout << (int)str[i] << ' ';
   } // -15 -14 -16 -18 -22 -32 32 115 116 114
   std::cout << std::endl;

   // Узнаем требуемый размер wstr
   count = MultiByteToWideChar(1251, 0, str, -1, wstr, 0);
   std::cout << "требуется " << count << std::endl; // требуется 11
   // Преобразование C-строки в кодировке windows-1251 в L-строку
   count = MultiByteToWideChar(1251, 0, str, -1, wstr, 255);
   std::cout << "записано " << count << std::endl;  // записано 11
   for (int i = 0, len = (int)std::wcslen(wstr); i < len; ++i) {
      std::cout << (int)wstr[i] << ' ';
   } // 1089 1090 1088 1086 1082 1072 32 115 116 114
   std::cout << std::endl;

   // Узнаем требуемый размер utf8
   count = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, utf8, 0,
                               NULL, NULL);
   std::cout << "требуется " << count << std::endl; // требуется 17
   // Преобразование L-строки в C-строку в кодировке UTF-8
   count = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, utf8, 255,
                               NULL, NULL);
   std::cout << "записано " << count << std::endl;  // записано 17
   for (int i = 0, len = (int)std::strlen(utf8); i < len; ++i) {
      std::cout << (int)utf8[i] << ' ';
   } // -47 -127 -47 -126 -47 -128 -48 -66 -48 -70 -48 -80 32 115 116 114
   std::cout << std::endl;

   // Узнаем требуемый размер wstr2
   count = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr2, 0);
   std::cout << "требуется " << count << std::endl; // требуется 11
   // Преобразование C-строки в кодировке UTF-8 в L-строку
   count = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr2, 255);
   std::cout << "записано " << count << std::endl;  // записано 11
   for (int i = 0, len = (int)std::wcslen(wstr2); i < len; ++i) {
      std::cout << (int)wstr2[i] << ' ';
   } // 1089 1090 1088 1086 1082 1072 32 115 116 114
   std::cout << std::endl;

   // Узнаем требуемый размер cp866
   char ch = '?';
   int flag = 1;
   // wstr[1] = L'u0263'; // символа нет в windows-866
   count = WideCharToMultiByte(866, 0, wstr, -1, cp866, 0, &ch, &flag);
   std::cout << "требуется " << count << std::endl; // требуется 11
   // Преобразование L-строки в C-строку в кодировке windows-866
   count = WideCharToMultiByte(866, 0, wstr, -1, cp866, 255, &ch, &flag);
   std::cout << "записано " << count << std::endl;  // записано 11
   for (int i = 0, len = (int)std::strlen(cp866); i < len; ++i) {
      std::cout << (int)cp866[i] << ' ';
   } // -31 -30 -32 -82 -86 -96 32 115 116 114
   std::cout << std::endl;
   std::cout << flag << std::endl; // 0
   return 0;
}

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Version: 20220421
By the same author: Virtour.fr — visites virtuelles

Универсальный декодер — конвертер кириллицы

Результат

[Результат перекодировки появится здесь…]

Гостевая книга

Поставьте ссылку на наш сайт!

<a href=»https://2cyr.com/decode/»>Универсальный декодер кириллицы</a>

Custom Work
For a small fee I can help you quickly recode/recover large pieces of data — texts, databases, websites… or write custom functions you can use (invoice available).
FAQ and contact information.

О программе

Здравствуйте! Эта страница может пригодиться, если вам прислали текст (предположительно на кириллице), который отображается в виде странной комбинации загадочных символов. Программа попытается угадать кодировку, а если не получится, покажет примеры всех комбинаций кодировок, чтобы вы могли выбрать подходящую.

Использование

  • Скопируйте текст в большое текстовое поле дешифратора. Несколько первых слов будут проанализированы, поэтому желательно, чтобы в них содержалась (закодированная) кириллица.
  • Программа попытается декодировать текст и выведет результат в нижнее поле.
  • В случае удачной перекодировки вы увидите текст в кириллице, который можно при необходимости скопировать и сохранить.
  • В случае неудачной перекодировки (текст не в кириллице, состоящий из тех же или других нечитаемых символов) можно выбрать из нового выпадающего списка вариант в кириллице (если их несколько, выбирайте самый длинный). Нажав OK вы получите корректный перекодированный текст.
  • Если текст перекодирован лишь частично, попробуйте выбрать другие варианты кириллицы из выпадающего списка.

Ограничения

  • Если текст состоит из вопросительных знаков («???? ?? ??????»), то проблема скорее всего на стороне отправителя и восстановить текст не получится. Попросите отправителя послать текст заново, желательно в формате простого текстового файла или в документе LibreOffice/OpenOffice/MSOffice.
  • Не любой текст может быть гарантированно декодирован, даже если есть вы уверены на 100%, что он написан в кириллице.
  • Анализируемый и декодированный тексты ограничены размером в 100 Кб.
  • Программа не всегда дает стопроцентную точность: при перекодировке из одной кодовой страницы в другую могут пропасть некоторые символы, такие как болгарские кавычки, реже отдельные буквы и т.п.
  • Программа проверяет максимум 7245 вариантов из двух и трех перекодировок: если имело место многократное перекодирование вроде koi8(utf(cp1251(utf))), оно не будет распознано или проверено. Обычно возможные и отображаемые верные варианты находятся между 32 и 255.
  • Если части текста закодированы в разных кодировках, программа сможет распознать только одну часть за раз.

Условия использования

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

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

Переводчики

Русский (Russian) : chAlx ; Пётр Васильев (http://yonyonson.livejournal.com/)

Страница подготовки переводов на другие языки находится тут.

Что нового

October 2013 : I am trying different optimizations for the system which should make the decoder run faster and handle more text. If you notice any problem, please notify me ASAP.

На английской версии страницы доступен changelog программы.

Вернуться к кириллической виртуальной клавиатуре.

Для конвертации на php строки из utf-8 в windows-1251 и наоборот, можно использовать следующую функцию:

Описание функции iconv:
string iconv ( string from_kodirovka, string to_kodirovka, string str )
Производит преобразование кодировки символов строки str из начальной кодировки from_kodirovka в конечную to_kodirovka. Возвращает строку в новой кодировке, или FALSE в случае ошибки.

Если добавить //TRANSLIT к параметру out_charset будет включена транслитеризация. Это означает, что вслучае, когда символа нет в конечной кодировке, он заменяется одним или несколькими аналогами. Если добавить //IGNORE, то символы, которых нет в конечной кодировке, будут опущены. Иначе, будет возвращена строка str, обрезанная до первого недопустимого символа.

В случае, если ваш хостинг не поддерживает iconv, для конвертации из utf-8 в win-1251 и наоборот можно использовать следующие функции:

function utf8_to_cp1251($s) {
    $tbl = $GLOBALS['unicode_to_cp1251_tbl'];
    $uc = 0;
    $bits = 0;
    $r = "";
    for($i = 0, $l = strlen($s); $i < $l; $i++) {
        $c = $s{$i};
        $b = ord($c);
        if($b & 0x80) {
            if($b & 0x40) {
                if($b & 0x20) {
                    $uc = ($b & 0x0F) << 12;
                    $bits = 12;
                } else {
                    $uc = ($b & 0x1F) << 6;
                    $bits = 6;
                }
            } else {
                $bits -= 6;
                if($bits) {
                    $uc |= ($b & 0x3F) << $bits;
                } else {
                    $uc |= $b & 0x3F;
                    if($cc = @$tbl[$uc]) {
                        $r .= $cc;
                    } else {
                        $r .= '?';
                    }
                }
            }
        } else {
            $r .= $c;
        }
    }
    return $r;
}
function cp1251_to_utf8($s) {
    $tbl = $GLOBALS['cp1251_to_utf8_tbl'];
    $r = "";
    for($i = 0, $l = strlen($s); $i < $l; $i++) {
        $c = $s{$i};
        $b = ord($c);
        if ($b < 128) {
            $r .= $c;
        } else {
            $r .= @$tbl[$b];
        }
    }
    return $r; 
} 

$unicode_to_cp1251_tbl = array(
0x0402 => "x80", 
0x0403 => "x81", 
0x201A => "x82", 
0x0453 => "x83", 
0x201E => "x84", 
0x2026 => "x85", 
0x2020 => "x86", 
0x2021 => "x87", 
0x20AC => "x88", 
0x2030 => "x89", 
0x0409 => "x8A", 
0x2039 => "x8B", 
0x040A => "x8C", 
0x040C => "x8D", 
0x040B => "x8E", 
0x040F => "x8F", 
0x0452 => "x90", 
0x2018 => "x91", 
0x2019 => "x92", 
0x201C => "x93", 
0x201D => "x94", 
0x2022 => "x95", 
0x2013 => "x96", 
0x2014 => "x97", 
0x2122 => "x99", 
0x0459 => "x9A", 
0x203A => "x9B", 
0x045A => "x9C", 
0x045C => "x9D", 
0x045B => "x9E", 
0x045F => "x9F", 
0x00A0 => "xA0", 
0x040E => "xA1", 
0x045E => "xA2", 
0x0408 => "xA3", 
0x00A4 => "xA4", 
0x0490 => "xA5", 
0x00A6 => "xA6", 
0x00A7 => "xA7", 
0x0401 => "xA8", 
0x00A9 => "xA9", 
0x0404 => "xAA", 
0x00AB => "xAB", 
0x00AC => "xAC", 
0x00AD => "xAD", 
0x00AE => "xAE", 
0x0407 => "xAF", 
0x00B0 => "xB0", 
0x00B1 => "xB1", 
0x0406 => "xB2", 
0x0456 => "xB3", 
0x0491 => "xB4", 
0x00B5 => "xB5", 
0x00B6 => "xB6", 
0x00B7 => "xB7", 
0x0451 => "xB8", 
0x2116 => "xB9", 
0x0454 => "xBA", 
0x00BB => "xBB", 
0x0458 => "xBC", 
0x0405 => "xBD", 
0x0455 => "xBE", 
0x0457 => "xBF", 
0x0410 => "xC0", 
0x0411 => "xC1", 
0x0412 => "xC2", 
0x0413 => "xC3", 
0x0414 => "xC4", 
0x0415 => "xC5", 
0x0416 => "xC6", 
0x0417 => "xC7", 
0x0418 => "xC8", 
0x0419 => "xC9", 
0x041A => "xCA", 
0x041B => "xCB", 
0x041C => "xCC", 
0x041D => "xCD", 
0x041E => "xCE", 
0x041F => "xCF", 
0x0420 => "xD0", 
0x0421 => "xD1", 
0x0422 => "xD2", 
0x0423 => "xD3", 
0x0424 => "xD4", 
0x0425 => "xD5", 
0x0426 => "xD6", 
0x0427 => "xD7", 
0x0428 => "xD8", 
0x0429 => "xD9", 
0x042A => "xDA", 
0x042B => "xDB", 
0x042C => "xDC", 
0x042D => "xDD", 
0x042E => "xDE", 
0x042F => "xDF", 
0x0430 => "xE0", 
0x0431 => "xE1", 
0x0432 => "xE2", 
0x0433 => "xE3", 
0x0434 => "xE4", 
0x0435 => "xE5", 
0x0436 => "xE6", 
0x0437 => "xE7", 
0x0438 => "xE8", 
0x0439 => "xE9", 
0x043A => "xEA", 
0x043B => "xEB", 
0x043C => "xEC", 
0x043D => "xED", 
0x043E => "xEE", 
0x043F => "xEF", 
0x0440 => "xF0", 
0x0441 => "xF1", 
0x0442 => "xF2", 
0x0443 => "xF3", 
0x0444 => "xF4", 
0x0445 => "xF5", 
0x0446 => "xF6", 
0x0447 => "xF7", 
0x0448 => "xF8", 
0x0449 => "xF9", 
0x044A => "xFA", 
0x044B => "xFB", 
0x044C => "xFC", 
0x044D => "xFD", 
0x044E => "xFE", 
0x044F => "xFF",
); 

$cp1251_to_utf8_tbl = array( 
0x80 => "xD0x82", 
0x81 => "xD0x83", 
0x82 => "xE2x80x9A", 
0x83 => "xD1x93", 
0x84 => "xE2x80x9E", 
0x85 => "xE2x80xA6", 
0x86 => "xE2x80xA0", 
0x87 => "xE2x80xA1", 
0x88 => "xE2x82xAC", 
0x89 => "xE2x80xB0", 
0x8A => "xD0x89", 
0x8B => "xE2x80xB9", 
0x8C => "xD0x8A", 
0x8D => "xD0x8C", 
0x8E => "xD0x8B", 
0x8F => "xD0x8F", 
0x90 => "xD1x92", 
0x91 => "xE2x80x98", 
0x92 => "xE2x80x99", 
0x93 => "xE2x80x9C", 
0x94 => "xE2x80x9D", 
0x95 => "xE2x80xA2", 
0x96 => "xE2x80x93", 
0x97 => "xE2x80x94", 
0x99 => "xE2x84xA2", 
0x9A => "xD1x99", 
0x9B => "xE2x80xBA", 
0x9C => "xD1x9A", 
0x9D => "xD1x9C", 
0x9E => "xD1x9B", 
0x9F => "xD1x9F", 
0xA0 => "xC2xA0", 
0xA1 => "xD0x8E", 
0xA2 => "xD1x9E", 
0xA3 => "xD0x88", 
0xA4 => "xC2xA4", 
0xA5 => "xD2x90", 
0xA6 => "xC2xA6", 
0xA7 => "xC2xA7", 
0xA8 => "xD0x81", 
0xA9 => "xC2xA9", 
0xAA => "xD0x84", 
0xAB => "xC2xAB", 
0xAC => "xC2xAC", 
0xAD => "xC2xAD", 
0xAE => "xC2xAE", 
0xAF => "xD0x87", 
0xB0 => "xC2xB0", 
0xB1 => "xC2xB1", 
0xB2 => "xD0x86", 
0xB3 => "xD1x96", 
0xB4 => "xD2x91", 
0xB5 => "xC2xB5", 
0xB6 => "xC2xB6", 
0xB7 => "xC2xB7", 
0xB8 => "xD1x91", 
0xB9 => "xE2x84x96", 
0xBA => "xD1x94", 
0xBB => "xC2xBB", 
0xBC => "xD1x98", 
0xBD => "xD0x85", 
0xBE => "xD1x95", 
0xBF => "xD1x97", 
0xC0 => "xD0x90", 
0xC1 => "xD0x91", 
0xC2 => "xD0x92", 
0xC3 => "xD0x93", 
0xC4 => "xD0x94", 
0xC5 => "xD0x95", 
0xC6 => "xD0x96", 
0xC7 => "xD0x97", 
0xC8 => "xD0x98", 
0xC9 => "xD0x99", 
0xCA => "xD0x9A", 
0xCB => "xD0x9B", 
0xCC => "xD0x9C", 
0xCD => "xD0x9D", 
0xCE => "xD0x9E", 
0xCF => "xD0x9F", 
0xD0 => "xD0xA0", 
0xD1 => "xD0xA1", 
0xD2 => "xD0xA2", 
0xD3 => "xD0xA3", 
0xD4 => "xD0xA4", 
0xD5 => "xD0xA5", 
0xD6 => "xD0xA6", 
0xD7 => "xD0xA7", 
0xD8 => "xD0xA8", 
0xD9 => "xD0xA9", 
0xDA => "xD0xAA", 
0xDB => "xD0xAB", 
0xDC => "xD0xAC", 
0xDD => "xD0xAD", 
0xDE => "xD0xAE", 
0xDF => "xD0xAF", 
0xE0 => "xD0xB0", 
0xE1 => "xD0xB1", 
0xE2 => "xD0xB2", 
0xE3 => "xD0xB3", 
0xE4 => "xD0xB4", 
0xE5 => "xD0xB5", 
0xE6 => "xD0xB6", 
0xE7 => "xD0xB7", 
0xE8 => "xD0xB8", 
0xE9 => "xD0xB9", 
0xEA => "xD0xBA", 
0xEB => "xD0xBB", 
0xEC => "xD0xBC", 
0xED => "xD0xBD", 
0xEE => "xD0xBE", 
0xEF => "xD0xBF", 
0xF0 => "xD1x80", 
0xF1 => "xD1x81", 
0xF2 => "xD1x82", 
0xF3 => "xD1x83", 
0xF4 => "xD1x84", 
0xF5 => "xD1x85", 
0xF6 => "xD1x86", 
0xF7 => "xD1x87", 
0xF8 => "xD1x88", 
0xF9 => "xD1x89", 
0xFA => "xD1x8A", 
0xFB => "xD1x8B", 
0xFC => "xD1x8C", 
0xFD => "xD1x8D", 
0xFE => "xD1x8E", 
0xFF => "xD1x8F", 
);

Кодировка текста – это схема нумерации символов, в которой каждому символу, цифре или знаку присвоено соответствующее число. Кодировку используют для сохранения и обработки текста на компьютере. Каждый раз при сохранении текста в файл он сохраняется с использованием определенной схемы кодирования, и при открытии этого файла необходимо использовать такую же схему, иначе восстановить исходный текст не получится. Самыми популярными кодировками для кириллицы сейчас являются 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 статей о ремонте компьютеров, работе с программами, настройке операционных систем.

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

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

51 / 49 / 26

Регистрация: 15.06.2009

Сообщений: 388

1

21.04.2018, 22:14. Показов 8084. Ответов 4


Всем привет! Возникла необходимость проверить, можно ли преобразовать некоторый текст UTF-8 в кодировку Windows-1251 без потерь. То есть, справедливо ли для заданного текста, что все символы текста существуют в таблице символов кодировки назначения и ни один из символов при преобразовании не будет заменён знаком вопроса.

Можно, конечно:

  • преобразовать весь текст в Windows-1251 с помощью Encoding.Convert() и потом сравнить с исходником — но это может оказаться затратным процессом;
  • посимвольно проверить строку на соответствие кодировке назначения до первого «фейла» — слишком низкоуровнево и «велосипедно». И мне не верится, что ничего подобного не идёт «в коробке» при всех гибких возможностях работы с кодировками в .NET.

Вопрос, собственно, — есть ли более простой, корректный, быстрый способ, о котором я не знаю?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Эксперт .NET

16926 / 12503 / 3286

Регистрация: 17.09.2011

Сообщений: 20,737

23.04.2018, 14:04

2

Цитата
Сообщение от Skorp24
Посмотреть сообщение

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

Нет.

Юникод поддерживает чуть более миллиона кодов, на данный момент используется что-то около сотни тысяч.
Кодировка Windows-1251 — однобитная, поддерживает максимум 256 кодов.
Следовательно, преобразование любого текста из кодировки UTF8 в Windows-1251 без потерь невозможно.
Если текст содержит только те же символы, которые присутствуют и в Windows-1251, то преобразуется без проблем.

Добавлено через 5 минут
Ну как обычно: сначала написал ответ, потом прочитал вопрос…

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



1



OwenGlendower

Администратор

Эксперт .NET

15244 / 12282 / 4905

Регистрация: 17.03.2014

Сообщений: 24,881

Записей в блоге: 1

24.04.2018, 18:23

3

Лучший ответ Сообщение было отмечено Skorp24 как решение

Решение

Skorp24, для небольшого текста можно сделать так:

C#
1
2
3
4
5
6
7
8
9
string s = "abc123абвu01C4";
var win1251 = Encoding.GetEncoding("windows-1251", EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback);
bool canConvert = false;
try
{
    var bytes = win1251.GetBytes(s);
    canConvert = true;
}
catch (EncoderFallbackException) { }



3



51 / 49 / 26

Регистрация: 15.06.2009

Сообщений: 388

25.04.2018, 14:07

 [ТС]

4

Всем спасибо! Пример с отлавливанием исключения оказался быстрее и выполняется примерно за 70 мс для строки в десять миллионов символов со случайными буквами; пример с конвертацией + сравнением — около 250 мс.



0



kolorotur

Эксперт .NET

16926 / 12503 / 3286

Регистрация: 17.09.2011

Сообщений: 20,737

25.04.2018, 16:25

5

Лучший ответ Сообщение было отмечено OwenGlendower как решение

Решение

Цитата
Сообщение от Skorp24
Посмотреть сообщение

выполняется примерно за 70 мс для строки в десять миллионов символов со случайными буквами; пример с конвертацией + сравнением — около 250 мс.

Это было расценено как вызов!!!1

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
static class EncodingExtensions
{
    public static unsafe bool CanConvert(this Encoding encoding, string text)
    {
        var encoder = encoding.GetEncoder();
        encoder.Fallback = EncoderFallback.ExceptionFallback;
 
        int byteLength = 1024;
        int charLength = text.Length;
 
        var buffer = stackalloc byte[byteLength];
        fixed (char* pBase = text)
        {
            bool completed;
            char* ptr = pBase;
            do
            {
                try
                {
                    encoder.Convert(ptr, charLength, buffer, byteLength, false, out int charsUsed, out int bytesUsed, out completed);
                    ptr += charsUsed;
                    charLength -= charsUsed;
                }
                catch (EncoderFallbackException) { return false; }
            } while (!completed);
        }
 
        return true;
    }
}

Использование:

C#
1
2
var encoding = Encoding.GetEncoding(1251);
encoding.CanConvert("Мама мыла раму");

Текст из 10 миллионов случайных символов русского и английского алфавита, а так же цифр, обрабатывает за ~30мс.
Реализация собственного EncoderFallback и EncoderFallbackBuffer, которые не бросают исключение, а просто прерывают цикл, серьезного прироста в производительности не дала.

Реализация, конечно, чистейший суррогат — исключительно попробовать «сделать быстрее».
Если текст надо не только проверить, но и заодно сконвертировать, то предыдущий вариант лучше — в нем можно заодно и вернуть массив сконвертированных байт.
Однако, если надо только проверить, особенно проверять на большом количестве строк с ненулевой вероятностью несовместимых, то имеет смысл протестировать в реальных условиях и этот вариант, т.к. он не создает в куче ни одного объекта (кроме исключения при несовместимости) — меньше нагрузка на память и на сборщика.



3



Понравилась статья? Поделить с друзьями:
  • Как преобразовать разделы mbr в gpt при установке windows 10
  • Как привести компьютер в первоначальное состояние windows 10
  • Как преобразовать мбр в gpt при установке windows 10
  • Как привести windows 8 к исходному состоянию
  • Как преобразовать логический диск в основной в windows 7