Не могу найти подходящий метод. Все виндосовские функции "хотят" использовать другой буфер для вывода. Тупое добавление нулей не всегда работает, например, когда в тексте присутствуют русские буквы.
Прежде чем переводить, нужно указать - в какой Ascii-кодировке наш текст. Ну а потом переводить отдельно для каждой кодировки. Лучше всего составить таблицу всех Unicode-символов и отдельные таблицы для каждой кодировки, которые будут указывать - каким символам Unicode-таблицы они соответствуют. Для этого должны быть WinAPI-функции - если не нравятся - пиши собственные.
katrus с русскими буквами всё просто Код (Text): ;----------------------------------------------------------------------------- ; Определяет UNICODE строку sUNICODE MACRO ANSI_String % IRPC A_Char, <ANSI_String> IFE ("&A_Char&" - 27h) ; <- игнорировать символы кавычек '' ELSEIFE ("&A_Char&" and 80h) ; <= 7Fh - цифры и латиница db "&A_Char&", 0h ELSEIFE (("&A_Char&" and 0C0h) - 0C0h) ; >= 0C0h Кириллица db ("&A_Char&" - 0B0h), 04h ELSEIFE ("&A_Char&" - 0A7h) ; § db 0A7h, 0h ELSEIFE ("&A_Char&" - 0A8h) ; Ё db 01h, 04h ELSEIFE ("&A_Char&" - 0A9h) ; © db 0A9h, 0h ELSEIFE ("&A_Char&" - 0B8h) ; ё db 051h, 04h ELSEIFE ("&A_Char&" - 0B9h) ; № db 016h, 21h ELSEIFE ("&A_Char&" - 0AEh) ; ® db 0AEh, 0h ELSEIFE ("&A_Char&" - 0B0h) ; ° db 0B0h, 0h ELSEIFE ("&A_Char&" - 0B1h) ; ± db 0B1h, 0h ENDIF ENDM ENDM но для полной универсальности своих функций кури официальные стандарты на уникод
Y_Mur Спасибо, но хотелось бы что то более общее, подходящее и для других языков. Странно, что нет функции конвертирующей один единственный юникод символ.
katrus "двухбуферный" вариант нужен чтобы не копировать весь хвост строки при расширении\сужении каждого символа , если нужен однобуферный вариант - стандартный приём - сделать обёртку с временным буфером, который потом скопируешь в исходный - одно копирование буфера полюбому быстрее многократного копирования "хвостов" вызывать extern функцию для каждого символа тоже не дзен (другое дело inline функция, но её смотри в сорцах, а не среди api . Для "упрощённого" преобразования см. ключики %C и %W в wsprintf, но у меня большое подозрение что она всё равно вызывает MultiByteToWideChar или WideCharToMultiByte (и тоже требует выходного буфера с местом под завершающий 0), так что если не нужна "вся мощь" wsprintf, лучше сделай свою обёртку.
katrus конечно, только ширина символа разная. Кстати при сужении (WideCharToMultiByte) по идее должно сработать и если указать в качестве входного и выходного параметра один и тот же адрес, да и при расширении (MultiByteToWideChar) если символ только один это тоже должно сработать, но проверять лень да и с мультивиндовостью этого варианта вопрос неоднозначный, хотя если там всё сделано логично, то должно работать везде.
Ursus А ви имеете что-то возразить? или желаете уточнить про достаточно экзотический флаг WC_COMPOSITECHECK? - тогда лучше сказать "почти всегда" )