Winsows-приложение Unicode
Модератор: Модераторы
Winsows-приложение Unicode
Пользователи программы с нерусскими локалями WindowsXP жалуются на "???" вместо символов в интерфейсе. В связи с этим решил сделать Unicode-версию программы.
Как сие осуществить? Подставлять после функций Api символ W? Этого достаточно? Есть ли ключ или какой-другой способ для того, чтобы копилятор сам использовал по умолчанию Unicode-версии функций?
Вышеописанное интересует как относительно FPC, так и Delphi. Извините за откровенное ламерство в этом вопросе - просто никогда не сталкивался.
Как сие осуществить? Подставлять после функций Api символ W? Этого достаточно? Есть ли ключ или какой-другой способ для того, чтобы копилятор сам использовал по умолчанию Unicode-версии функций?
Вышеописанное интересует как относительно FPC, так и Delphi. Извините за откровенное ламерство в этом вопросе - просто никогда не сталкивался.
Существует несколько реализаций Unicode, одна из них это двухбайтная UTF-16 в Винде она реализована в функциях с суффиксом W. Насколько я знаю, соответствующего ключа и нет! Если ты хочешь действительно работать с UTF-16, то тебя не остановит отсутствие ключа компиляции и ты будешь переписывать. На самом деле, даже если ты перепишишь интерфейс на WideString, нет никакой гарантии, что русские символы будут адекватно отражаться, если, конечно, ты их сам не рисуешь. Может быть достаточно озаботится изменением языка интефейса, это гораздо дешевле. Конвертация WideString <-> AnsiString производится в соответствии с локалью (в Делфи) в FPC у меня работало немного не так.
В винде можно попробовать рисовать текст самому с помошью функций-W (не пробовал)
В винде можно попробовать рисовать текст самому с помошью функций-W (не пробовал)
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Uniser писал(а):Существует несколько реализаций Unicode, одна из них это двухбайтная UTF-16 в Винде она реализована в функциях с суффиксом W. Насколько я знаю, соответствующего ключа и нет!
Если не нужна совметсимость с Дельфи - можно написать вашу программу на MSEgui. Там всюду юникод - поэтому пофигу, в какой ОС и в какой локали запускаешь программу - главное, чтобы в шрифтах были нужные символы. Если использовать TTF-шрифты - получаешь, как правило, полную "прозрачность". На крайняк, шрифты можно указать в командной строке MSEgui-программы ( есть такая фича ).
если кому интересно, сделал так
т.е. если надо вставить уникод из программы (при условии что код в ansi) нужно писать
pconv(' строка')
состояние преобразована строка или нет хранится в 1-м символе, а ссылка возвр. на 2-й
)
Код: Выделить всё
type _pchar = wchar;
function pconv(s:_pchar):_pchar; inline;
var p : pchar absolute s;
s0 : pchar;
begin
if sizeof(s^)=1 then exit; // not wchar
s0 := p;
if p^ <> ' ' then
else
begin
p^ := '.';
while p^ <> #0 do
begin
inc(p,2);
if (p^>= #$C0) and (p^<=#$FF) then
dec(pbyte(p)^,$b0)
else
if p^ = #$A8 then p^ := #$04
else continue;
(p+1)^ := #$04;
end;
end;
result := pointer(s0) + sizeof(s^);
end;
т.е. если надо вставить уникод из программы (при условии что код в ansi) нужно писать
pconv(' строка')
состояние преобразована строка или нет хранится в 1-м символе, а ссылка возвр. на 2-й
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
http://www.freepascal.ru/article//freepascal/20051026001249/ — вот тут советуется, что можно делать исходные коды в UTF-8 и переводить их в программе.
Я провал сделать MessageBoxW таким образом и у меня всё вывело.
Я провал сделать MessageBoxW таким образом и у меня всё вывело.
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Sergei I. Gorelkin писал(а):Во жесть...
Вообще говоря, слышал я краем уха, что FPC понимает исходники в utf-8, имеет директиву {$codepage xxx} и соответствующий ей ключ командной строки, которые позволяют задавать кодировку прямо в исходнике...
Недокументированная опция FPC "-Fcut8" позволяет вести исходники в UTF8-кодировке. Применяется, например, в MSE* - если нужно хранить текстовые константы прямо в коде программы, а не вресурсах и т.п., а также выводить русский текст в MessageBox независимо от операционки и системной локали.
