Вверх ↑
Ответов: 4629
Рейтинг: 749
#1: 2023-09-01 22:31:47 ЛС | профиль | цитата
Для того, чтобы из одной не родной для компилятора (в данном случае, 1..4-байтовой UTF-8 65001) кодировки преобразовать во 2-ю не родную (1251), нужно сначала из кодировки компилятора UTF-16 (в которой она находится в поле ввода) преобразовать в эту 1-ю неродную кодировку. А раз 2-я кодировка не является родной, то чтобы отобразить её в Юникодном окне - её надо преобразовать в 3-й раз в родную для компилятора UTF-16 (1200).

Поэтому в Unicode-режиме в исходной схеме потребуется 3-ное преобразование: из 2-байтной UTF-16 в 1-байтовую, которая будет выдана конвертером как "бинарная строка" (читать моё объяснение в архиве с пакетом) и будет подразумеваться в кодировке 65001. Затем из неё можно получить 2-ю неродную кодировку (1251), которая тоже будет выдана как "бинарная строка". И уже с этой 2-й неродной кодировки преобразовать в родную UTF-16 (1200).

Но если нет необходимости как-то дополнительно использовать кодировку 1251 (а в исходной UTF-8 могли быть символы из других языков - они будут потеряны при преобразовании в 1251), то можно обойтись 2-мя преобразованиями - сразу в кодировку компилятора:


Add(MainForm,10727861,231,231)
{
Width=654
Height=177
link(onCreate,16406789:doWork1,[(354,251)])
}
Add(Charset,11244778,476,273)
{
Type=7
Point(doCharset)
Point(onError)
link(onCharset,4837426:doEvent1,[])
}
Add(Edit,3664310,420,133)
{
Left=25
Top=35
Width=595
Text="Другие материалы"
}
Add(Button,3948234,294,273)
{
Left=165
Top=5
link(onClick,16406789:doWork2,[])
}
Add(Label,9542030,819,238)
{
Left=30
Top=65
Width=590
AutoSize=1
}
Add(ClipboardHook,1205846,819,280)
{
}
Add(HubEx,16406789,350,273)
{
link(onEvent,7428293:doCharset,[])
}
Add(Edit,12772419,630,112)
{
Left=85
Top=5
Width=60
Text="65001"
DataType=2
}
Add(Edit,11727262,672,112)
{
Left=240
Top=5
Text="1251"
DataType=2
}
Add(Charset,7428293,420,273)
{
Type=14
Point(onError)
Point(doCharset)
link(onCharset,11244778:doCharset,[])
link(Text,7122144:Var2,[])
}
Add(Charset,533901,623,210)
{
Type=8
Point(doCharset)
Point(onError)
link(onCharset,7457542:doCharset,[])
link(CodePage1,12772419:Text,[])
link(CodePage2,8084626:Var2,[(643,175)(678,175)])
}
Add(Charset,5678264,567,210)
{
Type=14
Point(doCharset)
Point(onError)
link(onCharset,533901:doCharset,[])
link(Text,7122144:Var3,[(573,180)])
}
Add(GetDataEx,7122144,420,175)
{
link(Data,3664310:Text,[])
}
Add(Hub,4837426,749,273)
{
link(onEvent1,9542030:doText,[(791,279)(791,244)])
link(onEvent2,1205846:doSetText,[])
}
Add(Charset,7457542,679,210)
{
Type=8
CodePage2=1200
Point(doCharset)
Point(onError)
link(CodePage1,8084626:Var3,[(692,159)])
AddHint(35,-25,39,13,CodePage2)
}
Add(GetDataEx,8084626,672,154)
{
link(Data,11727262:Text,[])
}
Для ANSI компилятора в схеме будут такие нюансы:
1) в 3-этапной схеме преобразования 1-е преобразование "Str->ANSI" ничего не будет делать, так как Str=ANSI в этом случае, а 3-е преобразование нужно выкинуть.
2) в 2-этапном (правильном) варианте в схеме ничего менять не нужно. 1-е преобразование ничего не будет делать по той же причине, а во 2-м "UTF-8->Str" Str будет равно ANSI (кодировке компилятора).
3) на Windows с "кодировкой по-умолчанию для программ, не поддерживающих Юникод" равной 1251 преобразование из UTF-8 в ANSI будет приводить к потерям, если в строке UTF-8 были символы на других языках. Содержимое строки в исходном поле ввода должно будет соответствовать этой настройке системы. (Если кто-то попытается запустить эту схему во Франции, то в поле ввода будут знаки вопроса).
4) копирование в буфер обмена без переключения раскладки клавиатуры на кириллицу будет выдавать "крякозябры". У Юникодного компилятора такого не будет.
карма: 26

0
Редактировалось 8 раз(а), последний 2023-09-01 23:00:34