Чтение/запись текста в кодировке UTF-8 из 1c 7.7

Демонстрация перекодировки текста в/из UTF-8 штатными средствами 1с 7.7

На полную универсальность не претендует, но с русскими буквами работает нормально.

Добавлена поддержка букв Ёё.

Собственно функции перекодировки:

Функция ПреобразоватьСтрокуВУТФ8(Стр)
Длина=СтрДлина(Стр);
Итог="";
Для Н=1 По Длина Цикл
Знак=Сред(Стр,Н,1);
Код=КодСимв(Знак);
Если Код<128 Тогда
Итог=Итог+Знак;
Иначе
Если (Код>=КодСимв("А"))И(Код<=КодСимв("п")) Тогда
Итог=Итог+Симв(208)+Симв(144+Код-КодСимв("А"));
ИначеЕсли (Код>=КодСимв("р"))И(Код<=КодСимв("я")) Тогда
Итог=Итог+Симв(209)+Симв(128+Код-КодСимв("р"));
ИначеЕсли (Знак="ё") Тогда
Итог=Итог+Симв(209)+Симв(145);
ИначеЕсли (Знак="Ё") Тогда
Итог=Итог+Симв(208)+Симв(129);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Итог;
КонецФункции
Функция ПреобразоватьСтрокуИзУТФ8(Стр)
Длина=СтрДлина(Стр);
Итог="";
Для Н=1 По Длина Цикл
Знак=Сред(Стр,Н,1);
Код=КодСимв(Знак);
Если Код<128 Тогда
Итог=Итог+Знак;
ИначеЕсли (Код>=128)И(Код<192) Тогда
Иначе
Н=Н+1;
Знак2=Сред(Стр,Н,1);
Код2=КодСимв(Знак2);
Если Код=208 Тогда
Если Код2=129 Тогда Итог=Итог+"Ё";
Иначе Итог=Итог+Симв(КодСимв("А")+Код2-144);
КонецЕсли;
ИначеЕсли Код=209 Тогда
Если Код2=145 Тогда Итог=Итог+"ё";
Иначе Итог=Итог+Симв(КодСимв("р")+Код2-128);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Итог;
КонецФункции
 

26 Comments

  1. Душелов

    За штатное плюс! Хорошая идея.

    Reply
  2. artbear

    Так проверить-то легко 🙂 —

    формируешь длинный текст из всех возможных печатаемых символов Вин-кодировки код > 31 и <256), преобразуешь его в UTF, далее преобразуешь его обратно в Вин, и сравниваешь полученную строку с исходной.

    Если есть различия, значит, прога неверна 🙂

    Reply
  3. NightHawk

    Спасибо автору. Очень даже выручило)

    Reply
  4. jk3

    Поставим плюс, может когда-нибудь пригодится

    Reply
  5. coder

    вот только в начале любого файла в UTF-8 есть такие символы п»ї и если пользоватся этими функциями то он урезает некоторую часть строки.

    Reply
  6. nickVZ

    Для автора. Есть такой вполне даже штатный для виндов объект: ADODB.Stream. И у этого объекта есть параметр Charset, задающий кодировку.

    Попробуй.

    http://msdn.microsoft.com/en-us/library/ms808793.aspx

    Reply
  7. ssp_

    (5) наверно это BOM-символ, который показывает, какая кодировка идет дальше. И для utf=8 он применяется не всегда.

    Проверку добавить легко, шестнадцатеричные коды EF BB BF

    http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4

    Reply
  8. ssp_

    (6) ИМХО чтобы записать/прочитать небольшой текстик, содержащий заведомо только ASCII+русские буквы, мой способ будет быстрее и надежнее

    Reply
  9. ssp_

    Вот вариант, учтывающий символы, кодируемые более чем 2 байтами. Просто пропускает их. Должно помочь от BOM.

    Функция ПреобразоватьСтрокуИзУТФ8(Стр)

    Длина=СтрДлина(Стр);

    Итог=»»;

    Для Н=1 По Длина Цикл

    Знак=Сред(Стр,Н,1);

    Код=КодСимв(Знак);

    Если Код<128 Тогда

    Итог=Итог+Знак;

    ИначеЕсли (Код>=128)И(Код<192) Тогда

    Иначе

    Н=Н+1;

    Знак2=Сред(Стр,Н,1);

    Код2=КодСимв(Знак2);

    Если Код=208 Тогда

    Итог=Итог+Симв(КодСимв(«А»)+Код2-144);

    ИначеЕсли Код=209 Тогда

    Итог=Итог+Симв(КодСимв(«р»)+Код2-128);

    КонецЕсли;

    КонецЕсли;

    КонецЦикла;

    Возврат Итог;

    КонецФункции

    Reply
  10. maloi_a

    (2) Это необходимо, но недостаточно.

    Для текста из русских букв не хватает преобразования двух символов: Ё и ё.

    Reply
  11. ArCtic

    круто, давно искал как это сделать!

    Reply
  12. ssp_

    (10) добавил

    Reply
  13. maloi_a

    (12) Как ни странно, но есть ещё один «русский» символ — №, который в алфавит не входит, но может набираться на русской раскладке клавиатуры.

    Reply
  14. Lexus

    для украинского языка можно добавить

    ———-

    Иначе

    Если (Код>=КодСимв(«А»))И(Код<=КодСимв(«п»)) Тогда

    Итог=Итог+Симв(208)+Симв(144+Код-КодСимв(«А»));

    ИначеЕсли (Код>=КодСимв(«р»))И(Код<=КодСимв(«я»)) Тогда

    Итог=Итог+Симв(209)+Симв(128+Код-КодСимв(«р»));

    ИначеЕсли (Знак=»ё») Тогда

    Итог=Итог+Симв(209)+Симв(145);

    ИначеЕсли (Знак=»Ё») Тогда

    Итог=Итог+Симв(208)+Симв(129);

    ИначеЕсли (Знак=»і») Тогда

    Итог=Итог+Симв(208)+Симв(150);

    ИначеЕсли (Знак=»ї») Тогда

    Итог=Итог+Симв(208)+Симв(151);

    КонецЕсли;

    КонецЕсли;

    ———

    ИначеЕсли Код=209 Тогда

    Если Код2=145 Тогда Итог=Итог+»ё»;

    ИначеЕсли Код2=150 Тогда Итог=Итог+»і»; // украинская

    ИначеЕсли Код2=151 Тогда Итог=Итог+»ї»; // украинская


    Иначе

    Итог=Итог+Симв(КодСимв(«р»)+Код2-128);

    КонецЕсли;

    КонецЕсли;

    ———

    Reply
  15. ankr

    Вариант от ssp_ мне больше понравился 🙂

    Тем не менее, автору за идею +

    Reply
  16. АндрейКр

    Спасибо за обработку! Помогло.

    Reply
  17. 7fortune

    а для 8 нет такой обработки?

    Reply
  18. curdate

    Пригодилась обработка, спасибо.

    (17) Так функции одинаковые. Если и понадобятся исправления — они будут косметическими.

    Reply
  19. popov_vitaly

    Пригодилась обработка, спасибо.

    Reply
  20. alexeyburtsev

    Спасибо!

    Reply
  21. Tavalik

    Спасибо, пригодилось.

    Reply
  22. Deryni

    Добавил вариант для украинских символов І, і, Ї, ї, Є, є

    Возможно, наверное, более изящно, но не охоты было возиться.

    Функция ПреобразоватьСтрокуВУТФ8(Стр)
    Длина=СтрДлина(Стр);
    Итог=»»;
    Для Н=1 По Длина Цикл
    Знак=Сред(Стр,Н,1);
    Код=КодСимв(Знак);
    Если Код<128 Тогда
    Итог=Итог+Знак;
    Иначе
    Если (Знак=»і») Тогда
    Итог=Итог+Симв(209)+Симв(150);
    ИначеЕсли (Знак=»І») Тогда
    Итог=Итог+Симв(208)+Симв(134);
    ИначеЕсли (Знак=»ї») Тогда
    Итог=Итог+Симв(209)+Симв(151);
    ИначеЕсли (Знак=»Ї») Тогда
    Итог=Итог+Симв(208)+Симв(135);
    ИначеЕсли (Знак=»є») Тогда
    Итог=Итог+Симв(209)+Симв(148);
    ИначеЕсли (Знак=»Є») Тогда
    Итог=Итог+Симв(208)+Симв(132);
    ИначеЕсли (Код>=КодСимв(«А»))И(Код<=КодСимв(«п»)) Тогда
    Итог=Итог+Симв(208)+Симв(144+Код-КодСимв(«А»));
    ИначеЕсли (Код>=КодСимв(«р»))И(Код<=КодСимв(«я»)) Тогда
    Итог=Итог+Симв(209)+Симв(128+Код-КодСимв(«р»));
    ИначеЕсли (Знак=»ё») Тогда
    Итог=Итог+Симв(209)+Симв(145);
    ИначеЕсли (Знак=»Ё») Тогда
    Итог=Итог+Симв(208)+Симв(129);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Возврат Итог;
    КонецФункции
    
    Функция ПреобразоватьСтрокуИзУТФ8(Стр)
    Длина=СтрДлина(Стр);
    Итог=»»;
    Для Н=1 По Длина Цикл
    Знак=Сред(Стр,Н,1);
    Код=КодСимв(Знак);
    Если Код<128 Тогда
    Итог=Итог+Знак;
    ИначеЕсли (Код>=128)И(Код<192) Тогда
    Иначе
    Н=Н+1;
    Знак2=Сред(Стр,Н,1);
    Код2=КодСимв(Знак2);
    Если Код=208 Тогда
    Если Код2=129 Тогда Итог=Итог+»Ё»;
    ИначеЕсли Код2=134 Тогда Итог=Итог+»І»;
    ИначеЕсли Код2=135 Тогда Итог=Итог+»Ї»;
    ИначеЕсли Код2=132 Тогда Итог=Итог+»Є»;
    Иначе Итог=Итог+Симв(КодСимв(«А»)+Код2-144);
    КонецЕсли;
    ИначеЕсли Код=209 Тогда
    Если Код2=145 Тогда Итог=Итог+»ё»;
    ИначеЕсли Код2=150 Тогда Итог=Итог+»і»; // украинская
    ИначеЕсли Код2=151 Тогда Итог=Итог+»ї»; // украинская
    ИначеЕсли Код2=148 Тогда Итог=Итог+»є»; // украинская
    Иначе Итог=Итог+Симв(КодСимв(«р»)+Код2-128);
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Возврат Итог;
    КонецФункции
    

    Показать

    Reply
  23. One

    Спасибо автору за готовый код — сильно выручил.

    Reply
  24. Helle

    Спасибо, очень помогли!

    Reply
  25. Dima_

    Спасибо, Автору!

    Но, замечание в (13) maloi_a, проигнорировали?

    Функция преобразования «ПреобразоватьСтрокуВУТФ8» символ номера просто пропускает.

    Аналогично поступает и «ПреобразоватьСтрокуИзУТФ8».

    Пришлось доработать для символа «№»:

    Функция ПреобразоватьСтрокуВУТФ8(Стр)
    Стр=СокрЛП(Стр);
    Длина=СтрДлина(Стр);
    Итог=»»;
    Для Н=1 По Длина Цикл
    Знак=Сред(Стр,Н,1);
    Код=КодСимв(Знак);
    Если Код<128 Тогда
    Итог=Итог+Знак;
    Иначе
    Если (Код>=КодСимв(«А»))И(Код<=КодСимв(«п»)) Тогда
    Итог=Итог+Симв(208)+Симв(144+Код-КодСимв(«А»));
    ИначеЕсли (Код>=КодСимв(«р»))И(Код<=КодСимв(«я»)) Тогда
    Итог=Итог+Симв(209)+Симв(128+Код-КодСимв(«р»));
    ИначеЕсли (Знак=»ё») Тогда
    Итог=Итог+Симв(209)+Симв(145);
    ИначеЕсли (Знак=»Ё») Тогда
    Итог=Итог+Симв(208)+Симв(129);
    ИначеЕсли (Знак=»№») Тогда
    Итог=Итог+Симв(226)+Симв(132)+Симв(150);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Возврат Итог;
    КонецФункции
    
    Функция ПреобразоватьСтрокуИзУТФ8(Стр)
    Длина=СтрДлина(Стр);
    Итог=»»;
    Для Н=1 По Длина Цикл
    Знак=Сред(Стр,Н,1);
    Код=КодСимв(Знак);
    Если Код<128 Тогда
    Итог=Итог+Знак;
    ИначеЕсли (Код>=128)И(Код<192) Тогда
    Иначе
    Н=Н+1;
    Знак2=Сред(Стр,Н,1);
    Код2=КодСимв(Знак2);
    Если Код=208 Тогда
    Если Код2=129 Тогда Итог=Итог+»Ё»;
    Иначе Итог=Итог+Симв(КодСимв(«А»)+Код2-144);
    КонецЕсли;
    ИначеЕсли Код=209 Тогда
    Если Код2=145 Тогда Итог=Итог+»ё»;
    Иначе Итог=Итог+Симв(КодСимв(«р»)+Код2-128);
    КонецЕсли;
    ИначеЕсли Код=226 Тогда
    Если Код2=132 Тогда
    Н=Н+1;
    Знак3=Сред(Стр,Н,1);
    Код3=КодСимв(Знак3);
    Если Код3=150 Тогда Итог=Итог+»№»;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Возврат Итог;
    КонецФункции
    

    Показать

    Reply
  26. Alexander.Dyatchenko

    Божественно! Какие глубинные познания в такой редкой области!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *