Кодировка utf 8 в windows 1251 онлайн

Привет, друзья. Я уже 3 года работаю с вебом, но с таким не встречался еще. В чем суть:
Есть у меня кириллический текст с кодировкой UTF-8 и отображается он нормально.
Мне нужно изменить кодировку на windows-1251 так, чтобы кириллический текст так же нормально читабельно отображался. И вот что-то ну вообще не могу взять в толк, как это сделать?


  • Вопрос задан

  • 29625 просмотров

Пригласить эксперта

для большого количества файлов есть однострочник на powershell:

Get-ChildItem folderwithfiles -File | foreach {Get-Content $_.fullname -Encoding UTF8 | Out-File folderwithconvertedfiles\$_ -encoding default}

Одна загвоздка : encoding default — берет кодировку системы.
Проверить что это windows 1251 можно так(powershell) :
[System.Text.Encoding]::Default.Codepage

Вы имеете в виду, самостоятельно, а не в программном коде? Тогда с помощью Вашего текстового редактора, которым Вы пользуетесь. Например, если Вы предпочитаете Sublime Text, то просто воспользуйтесь пунктом меню File->Save with encoding > Cyrillic (Windows 1251)

Войдите, чтобы написать ответ


  • Показать ещё
    Загружается…

Минуточку внимания

v7: Перекодировка файла из utf8 в 1251

0

zenon46

28.05.24

12:57

Доброго дня!

Столкнулся с проблемой, с сайта прилетает файл в кодировке utf8, данные необходимо загрузить в базу, пытался перекодировать файл через Adodb.Stream, закрывается предприятие, думал файл слишком большой (10 мегабайт), урезал до 8 килобайт, та же история.

Вот собственно код :

    АдоДБСтрим = CreateObject(«Adodb.Stream»);

    АдоДБСтрим.Charset=»utf-8″;

    АдоДБСтрим.Type = 2;

    АдоДБСтрим.Mode= 3;

    АдоДБСтрим.Open();

    АдоДБСтрим.LoadFromFile(КаталогПользователя()+»products.json»);

    ТекстАдоДБСтрим = АдоДБСтрим.ReadText();

    АдоДБСтрим.Close();

    АдоДБСтрим.Charset = «windows-1251»;

    АдоДБСтрим.Open();

    АдоДБСтрим.WriteText(ТекстАдоДБСтрим);

    АдоДБСтрим.SaveToFile(КаталогПользователя()+»products.json», 2);

    АдоДБСтрим.Close();

Что не так ?

UPD Падает именно по размеру, с маленьким отрабатывает нормально.

1

Волшебник

28.05.24

12:56

v7 — вот что не так

2

trad

28.05.24

12:58

Загрузка из файла JSON/#16

это уже пробовал?

3

trad

28.05.24

13:01

>>урезал до 8 килобайт, та же история.

>>с маленьким отрабатывает нормально.

показания расходятся

4

zenon46

28.05.24

13:02

(2) с загрузкой все нормально, парсится нормально, вот только из за кодировки в кириллице «грузинский чай».

5

zenon46

28.05.24

13:03

(3) был не внимателен, не тот файл передавал на перекодировку. Думал что работаю с маленьким а передавал ссылку на большой. С маленьким файлом все ок.

6

zenon46

28.05.24

13:05

(3) запросить файл в кодировке 1251 не представляется возможным, те кто делал сайт сказали что нет технической возможности.

7

trad

28.05.24

13:10

(6) все же попробовать стоит. Те кто делал сайт вполне могут не догадываться что их сервер это умеет

8

trad

28.05.24

13:12

(5) тыщу раз уже обкашляли — не передать многобуков через ОЛЕ

Либо весь код из (0) полностью загонять в MSScriptControl и там, внутри, конвертить. Либо OleExSup

9

trad

28.05.24

13:13

(7) + попробуй

HTTP.setRequestHeader(«Accept-Charset», «windows-1251»);

10

zenon46

28.05.24

13:25

(9) Пробовал так Карлик.УстановитьПараметр(«HTTPHEADER»,»Content-Type: application/json;charset=windows-1251″);

Файл прилетает в 1251 но не читаем…

11

bmitkin

28.05.24

13:48

Была такая проблема. Разделили стримы на читающий и пишущий.

Вот такой код у меня справляется с большими файлами:

Байт=255;
СтримВход = СоздатьОбъект("Adodb.Stream");
СтримВход.Type = 2;
СтримВход.charset = ИзКодировки;
СтримВход.Open();
СтримВход.LoadFromFile(ВременныйФайл);
СтримВыход = СоздатьОбъект("Adodb.Stream");
СтримВыход.Type = 2;
СтримВыход.charset = ВКодировку;
СтримВыход.Open();
Пока СтримВход.EOS=0 Цикл
    СтримВыход.WriteText(СтримВход.ReadText(Байт),?(Байт=-2,1,0));
КонецЦикла;
СтримВход.Close();
СтримВыход.SaveToFile(ИмяФайла,2);

12

trad

28.05.24

13:56

(10) Content-Type — это про то что клиент/сервер передается сейчас в теле запроса/ответа.

Accept-Charset — это про то что клиент ожидает получить в теле ответа

13

Djelf

28.05.24

14:05

(10) Скинь полученный файл.

Adodb с карликом не требуется использовать.

Это как скрещивать ежа с ужом, теоретически возможно, а практически нет.

14

MWWRuza

28.05.24

15:15

Если уж карлика используете, то что мешает и конвертить с помощью него, из описания изменений:

// ————————————————————————————

2022.11.25 версия 1.0.0.8

СтрокаUTF8 = Карлик.ToUTF8(СтрокаASCII)

СтрокаASCII = Карлик.FromUTF8(СтрокаUTF8)

Аааа…. Не обратил внимание, там файл а не строка…

Тогда сложнее.

15

Djelf

28.05.24

15:17

+(14) Последний FormEx делает то же самое, и тем же самым кодом внутри.

Но оверхед копеечный, путь везде будет…

16

zenon46

28.05.24

15:18

(11) а ведь сработало. Спасибо!

Работая с 1С-Битрикс, нередко приходится сталкиваться с вопросами кодировок и конвертации текста. Особенно это заметно при интеграции с внешними системами или при неправильно настроенных кодировках в проекте. В таких случаях на помощь приходят различные функции, упрощающие обработку строк. В данной статье мы рассмотрим функцию utf8win1251, которая конвертирует строку из кодировки UTF-8 в Windows-1251, а также покажем несколько практических примеров её использования.

Функции для обработки строк и текста: utf8win1251

Описание функции

string utf8win1251(
    string $text
);

Функция utf8win1251 принимает на вход строку в кодировке UTF-8 и возвращает ту же строку, но уже перекодированную в Windows-1251.

Параметры

  • text (string) – исходная строка в кодировке UTF-8, которую нужно преобразовать в Windows-1251.

Возвращаемое значение

Функция возвращает строку, перекодированную в Windows-1251.

Где находится функция?

Функция определена в файле:

bitrix/modules/main/tools.php

Код функции выглядит следующим образом (на актуальных версиях 1С-Битрикс встраивается через пространство имён Main\Text\Encoding):

/**
 * @deprecated Use Main\Text\Encoding::convertEncoding()
 * @param $s
 * @return mixed
 */
function utf8win1251($s)
{
    return Main\Text\Encoding::convertEncoding($s, "UTF-8", "Windows-1251");
}

Обратите внимание, что данная функция помечена как устаревшая (deprecated). Разработчики 1С-Битрикс рекомендуют для конвертации кодировок использовать метод convertEncoding класса Main\Text\Encoding. Тем не менее, во многих проектах по-прежнему используется utf8win1251, поэтому её важно знать и уметь правильно применять.

Примеры использования

Ниже приведён ряд ситуаций, где может потребоваться конвертация строки из UTF-8 в Windows-1251. Все примеры кода предназначены для размещения в шаблонах, компонентах или других файлах PHP в рамках 1С-Битрикс.

1. Вывод статического текста

Самый простой пример – нужно вывести корректный текст на сайте, который работает в Windows-1251, а у нас есть какая-то строка в UTF-8:

<?
echo utf8win1251("битрикс");
// При выводе получится строка "битрикс"
?>

Часто можно столкнуться с ситуацией, когда при неправильных настройках кодировки в браузере текст «битрикс» отображается как «Р±РёС‚СЂРёРєСЃ». Вызов функции utf8win1251 решит эту проблему, перекодировав текст в нужную кодировку.

2. Конвертация переменной

Часто тексты приходят в виде переменных, например, из базы данных или от внешних API, и при вставке на страницу, настроенную на Windows-1251, вывод будет некорректен:

<?
$textFromApi = "Привет, мир!"; // Допустим, эта строка в UTF-8
echo utf8win1251($textFromApi);
// На странице в кодировке Windows-1251 корректно отобразится "Привет, мир!"
?>

3. Конвертация данных при сохранении в файлы

Допустим, у вас есть форма, где пользователь вводит какую-то информацию на сайте с UTF-8 кодировкой, а вам нужно сохранить этот текст в файл .txt, который будет обрабатываться системой, ожидающей данные в Windows-1251.

<?
$userInput = $_POST["user_message"]; // Предположим, что сайт работает в UTF-8
$userInputInWin1251 = utf8win1251($userInput);

// Сохраняем в файл
file_put_contents($_SERVER["DOCUMENT_ROOT"]."/upload/user_message.txt", $userInputInWin1251);

// Теперь в файле данные лежат в кодировке Windows-1251
?>

4. Массовая конвертация массива данных

Хотя сама функция utf8win1251 рассчитана на один параметр (строку), никто не мешает вам применить её к массиву. Например, если у вас есть массив текстов, которые нужно перекодировать, можно использовать array_map:

<?
$texts = [
    "Первый текст в UTF-8",
    "Второй текст в UTF-8",
    "Третий текст в UTF-8",
];

$textsWin1251 = array_map("utf8win1251", $texts);

print_r($textsWin1251);
?>

В результате в массиве $textsWin1251 вы получите те же тексты, но уже в кодировке Windows-1251.

5. Пример использования вместе с классом Encoding

Если вы хотите сделать более гибкое решение, например, автоматически определять исходную кодировку строки, то уже целесообразнее применять convertEncoding напрямую:

<?
use Bitrix\Main\Text\Encoding;

$text = "Какой-то UTF-8 текст";

// Определим кодировку автоматически
$detectedEncoding = mb_detect_encoding($text, ["UTF-8", "Windows-1251", "CP1251"]);

if ($detectedEncoding) {
    $textInWin1251 = Encoding::convertEncoding($text, $detectedEncoding, "Windows-1251");
    echo $textInWin1251;
} else {
    // Обработка случая, когда кодировку определить не удалось
    echo "Не удалось определить кодировку строки";
}
?>

Однако если у вас чёткая уверенность, что входной текст всегда в UTF-8, тогда utf8win1251 действительно сокращает код, делая его максимально простым.

Полезно знать

  1. Проверка текущей кодировки страницы
    Если ваш сайт работает в кодировке Windows-1251 (что в современных проектах встречается всё реже, но в старых проектах по-прежнему актуально), всегда проверяйте наличие правильного метатега <meta charset="windows-1251"> или заголовка Content-Type: text/html; charset=windows-1251.
  2. Использование функции в компонентах
    При написании собственных компонентов или переопределении стандартных, вы можете вызывать utf8win1251 в файлах component.php, template.php или других участках кода. Главное – следите, чтобы функция была подключена (обычно она доступна во всей среде 1С-Битрикс по умолчанию).
  3. Устаревание функции
    Как уже упоминалось выше, utf8win1251 помечена как устаревшая. Рекомендуется использовать более универсальный метод convertEncoding из класса Main\Text\Encoding. Однако если в проекте сохранились старые компоненты, скрипты или модули, где вызов utf8win1251 встречается повсеместно, вы можете смело пользоваться им, пока не перейдёте на современные методы.
  4. Дополнительная оптимизация
    Если вам часто приходится работать с конвертацией кодировок, желательно привести проект к единому стандарту – например, полностью перейти на UTF-8. В этом случае необходимость использования подобных функций отпадёт. Но если есть внешние зависимости (включая обмен данными с другими системами, которые до сих пор работают в Windows-1251), функция utf8win1251 или метод convertEncoding будут лучшим решением.

Заключение

Функция utf8win1251 – это быстрый и удобный способ преобразовать UTF-8 строку в Windows-1251 в 1С-Битрикс. Несмотря на то, что она помечена как устаревшая и в новых проектах лучше применять convertEncoding, данная функция по-прежнему широко используется в наследованных проектах.

Если ваш сайт или проект нуждается в корректном отображении кириллического текста на страницах с кодировкой Windows-1251, utf8win1251 может существенно упростить обработку и вывод строк. При этом важно помнить про актуальные методы класса Main\Text\Encoding, чтобы новые решения в вашем проекте соответствовали последним рекомендациям и стандартам 1С-Битрикс.

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

Теги: 
utf8win1251, кодировки, конвертация текста, Windows-1251, UTF-8

Проблема кодировок часто возникает при написании парсеров, чтении данных из 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 = "\xEF\xBB\xBF" .  $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 (JavaScript Object Notation) – текстовый формат обмена данными, основанный на JavaScript, который представляет собой набор пар {ключ: значение}. Значение может быть массивом, числом, строкой и…

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

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

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

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

Microsoft Office Outlook 2003 can automatically select an optimal encoding for outgoing e-mail messages. This feature increases the likelihood that when you send a message with Outlook, users receiving the message will see all the characters rendered properly, even if the users run older e-mail programs. Automatic messaging encoding results in less configuration work for administrators and a better experience for users.

Outlook scans the entire text of the outgoing message to determine a minimal popular encoding for the message. Outlook selects an encoding that is capable of representing all of the characters and that is optimized so that the majority of the receiving e-mail programs can interpret and render the content properly.

This table shows a few examples of how this works.

If the message contains these characters:

Outlook selects this encoding:

English (ASCII) text (A-Z, a-z)

US-ASCII

German (Latin 1) text (A-Z, a-z and Umlauts)

Western European (ISO)

Greek text (A-Z, a-z and Greek characters)

Greek (ISO)

Japanese text (A-Z, a-z, Hiragana, Katakana, Kanji)

Japanese (JIS)

Multilingual text (different scripts)

Unicode (UTF-8)

This works for users sending Internet mail through the POP/SMTP or IMAP transport, or for messages sent through Microsoft Exchange Server 5.5 SP 1 or later.

Note

To use the automatic message encoding feature, users sending the message must have Microsoft Internet Explorer 5.5 or later installed.

With earlier versions of Outlook, users had to manually overwrite format encoding to choose the most appropriate encoding for an individual message, but this is no longer necessary.

Disabling automatic encoding for outbound messages

By default, Outlook automatically selects the type of encoding that will be used for outbound messages once Internet Explorer 5.5 or later is installed. You can disable Auto-Select outbound message encoding with a registry key. For the following subkey, set Autodetect_CodePageOut to 0:

HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Outlook\Options\MSHTML\International

The value is a DWORD data type.

If the registry subkey is not found, if there is no value set for the registry subkey, or if the value is set to 1, Auto-Select is enabled.

You can enforce this setting by using Group Policy with the Outlook ADM file. In the Group Policy snap-in, the policy for disabling automatic message encoding is located in User Configuration\Administrative Templates\Microsoft Office Outlook 2003\Tools | Options\Mail Format\International Options. Double-click Encoding for outgoing messages, then select Disable to prevent Outlook from automatically encoding messages.

You can also set automatic encoding for outbound messages in the user interface.

To set automatic message encoding through the user interface

  1. On the Tools menu, click Options, then click the Mail Format tab.

  2. In the Message format section, click International Options, then select Auto-Select encoding for outgoing messages.

Setting default encoding for outbound messages

You can set a registry key to establish a default encoding for outbound e-mail messages. This encoding is used for all outbound messages if Auto-Select encoding is not enabled. This encoding is also used as the preferred encoding if the Auto-Select encoding algorithm finds multiple suitable encodings for the message. By default, Outlook sets preferred encoding to a popular Internet encoding corresponding to the active Microsoft Windows code page of the user’s computer. For example, Outlook specifies Western European (ISO) when running on Western European Latin1 Windows code page 1252.

For example, to set the default code page to be used for message encoding to “Western European (ISO),” you would set Default_CodePageOut to 00006faf in the following registry subkey:

HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Outlook\Options\MSHTML\International\

This value is a DWORD data type. (See the table in the next section for a list of encodings and corresponding code pages.)

You can enforce a specific encoding by using Group Policy with the Outlook adm file. In the Group Policy snap-in, the policy for configuring encoding for all outgoing messages is located in User Configuration\Administrative Templates\Microsoft Office Outlook 2003\Tools | Options\Mail Format\International Options. Double-click Encoding for outgoing messages, then select Enabled to allow configuring the policy. Choose an encoding from the Use this encoding for outgoing messages: drop-down list, then click OK.

To set a specific encoding value through the user interface

  1. Click Tools, click Options, then click the Mail Format tab.

  2. In the Message format section, click International Options.

  3. In the drop-down list for Preferred encoding for outgoing messages, select the encoding that you prefer.

Outlook encoding support

Outlook supports the encodings listed in the table below when sending and receiving e-mail messages.

Note

For automatic encoding selection in Outlook to work properly, you must make sure that appropriate international support (NLS files and fonts) is installed on users’ computers. For more information about enabling international support, see “Preparing Users’ Computers for Multilingual Capabilities in Office” in Chapter 13, “Preparing for an Office Multilingual Deployment.”

By default, automatic encoding selection in Outlook considers for detection all encodings marked “Yes” in the table below. All encodings in the list below are valid values to set as the “Preferred encoding for outgoing messages” by using the registry subkey Default_CodePageOut, described above.

Name

Character set

Code page

Auto-Select?

Arabic (ISO)

ISO-8859-6

28596

Arabic (Windows)

Windows-1256

1256

Yes

Baltic (ISO)

ISO-8859-4

28594

Baltic (Windows)

Windows-1257

1257

Yes

Central European (ISO)

ISO-8859-2

28592

Yes

Central European (Windows)

Windows-1250

1250

Chinese Simplified (GB2312)

GB2312

936

Yes

Chinese Simplified (HZ)

HZ-GB-2312

52936

Chinese Traditional (Big5)

Big5

950

Yes

Cyrillic (ISO)

ISO-8859-5

28595

Cyrillic (KOI8-R)

KOI8-R

20866

Yes

Cyrillic (KOI8-U)

KOI8-U

21866

Cyrillic (Windows)

Windows-1251

1251

Yes

Greek (ISO)

ISO-8859-7

28597

Yes

Greek (Windows)

Windows-1253

1253

Hebrew (ISO-Logical)

ISO-8859-8-I

38598

Hebrew (Windows)

Windows-1255

1255

Yes

Japanese (EUC)

EUC-JP

51932

Japanese (JIS)

ISO-2022-JP

50220

Yes

Japanese (JIS-Allow 1 byte Kana)

ISO-2022-JP

50221

Japanese (Shift-JIS)

Shift-JIS

932

Korean

KS_C_5601-1987

949

Yes

Korean (EUC)

EUC-KR

51949

Latin 3 (ISO)

ISO-8859-3

28593

Latin 9 (ISO)

ISO-8859-15

28605

Thai (Windows)

Windows-874

874

Yes

Turkish (ISO)

ISO-8859-9

28599

Yes

Turkish (Windows)

Windows-1254

1254

Unicode (UTF-7)

UTF-7

65000

Unicode (UTF-8)

UTF-8

65001

Yes

US-ASCII

US-ASCII

20127

Yes

Vietnamese (Windows)

Windows-1258

1258

Yes

Western European (ISO)

ISO-8859-1

28591

Yes

Western European (Windows)

Windows-1252

1252

Resources and related information

Outlook 2003 provides Unicode support throughout the product. For more information about how you can define Outlook user profiles to use Unicode, see “Configuring Unicode Options for Outlook 2003” earlier in this chapter.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Драйвер ft232rl usb uart windows 10
  • Core player для windows mobile
  • Aact kms активатор для операционных систем windows
  • Windows live mail windows 2012
  • Как подключить блютуз адаптер к компьютеру windows 10 видео