Проблема в следующем:
Не могу вставить в контрол текст в кодировке Unicode
Код должен переносить слова из файла source.txt в Listbox.
Если я сохраняю txt в кодировке ANSII, то всё нормально, а в Unicode - никак.
Текст должен быть в Unicode, поскольку в нём содержатся буквы ä, ö. Чтобы узнать, код или контрол не видит этих символов, я вставил в код строку
Debug.Prnt Temp
в окне Immediate
(Temp - переменная, которой присваивается строковое значение).
Так вот. Он мне пишет вместо этих букв козябры. То есть код не распознаёт. Ну, и соответственно, в Listbox он вставляет всё те же козябры.
Вот пример интерпретации бейсиком выражения Hyvää päivää:
яюHyvдд pдivдд
(Причём буквы яю в начале присутствуют при любом раскладе).
Пробовал ввести с клавиатуры буквы ä, ö в Textbox. Вводятся а, о.
При этом, когда похожий код пишешь в Excele, то работает всё прекрасно (только код берёт слова с листа excel).
Поискал я по форуму, здесь похожие вопросы уже не раз поднимались. Там советовали подключить библиотеку FM20.dll, и всё, якобы должно получиться.
Подключил.
Без изменений.
Неужели нельзя обойти как-нибудь данную проблему???
Процедура работы с уникодом в VB и VBA - довольно своеобразна.
Для обработки уникодовского файла его нужно прочитать в байтовый массив, а потом этот массив с помощью StrConv сконвертировать в обычный текст.
Я уже как-то давал на этом форуме примерчик работы с StrConv.
Поищите. Если не получится, я завтра накидаю примерчик.
Что Вы, какое сорри, я Вас очень ждал.
Вы мне как-то очень помогли.
А так, как Вы предлагаете (прямо-таки дословно), я уже пробовал (по совету уважаемого el-paso).
Пишет ошибку "Compile error: Variable required - can't assign to this expression".
To el-paso:
Спасибо Вам, попробую поискать, и буду ждать от Вас примерчик.
Вчера дома накидал что-то с учетом StrConv, вывод Unicode из файла в ListBox у меня получился, но первый символ вставился левый, вероятно это первые два байта, которые при других условиях выдают "яю", т.е. мой пример надо еще немного дорабатывать. Файл я открывал не как текстовый, а как бинарный и читал N байт в байтовый массив. Кстати, Jktu, ты куда-то не туда пытался считать, что за переменная Temp, какого она типа и т.д.? Результат считывания возвращает сама функция как результат, а не по ссылке в параметр. В общем, пока код у меня не отлаженный нет смысла его выкладывать. Кстати, а почему бы не задать Unicode строки не из файла, а сразу байтовым массивом в приложении? И это.. зачем постим тему по VB6 в раздел по VBA? путаница же получается! А насчет туториала по Unicode в VB6 - спасибо, есть в чем поразбираться, когда Unicode понадобится. Удачи!
Пишет "type mismatch" в этой строке:
sUnicode = Split(Mid(StrConv(Input(LOF(1), #1), vbFromUnicode), 2), vbCrLf),
а именно в этом месте:
Input(LOF(1), #1)
Я уже и номер файла менял по-всякому и переменные...
В экселе - работает, не пойму почему.
А подскажи мне, пожалуйста - как это:
mc-black пишет:
задать Unicode строки не из файла, а сразу байтовым массивом в приложении
PublicSub SaveUnicodeFile(FileName AsString, Text AsString, Optional LocaleID AsLong = 1049)
'
Dim s AsString: s = Text
Dim f AsInteger: f = FreeFile
'
s = Chr(255) & Chr(254) & StrConv(s, vbUnicode, LocaleID)
'
Open FileName For Binary As #f
Put #f, , s
Close #f
'
EndSub
Текст, загруженный первой функцией нормально выводится на контролы в формах VBA.
Есть еще там один необязательный "волшебный" параметр - LocaleID... Это идентификатор локали - той самой что зависит от региональных настроек Windows. Я по умолчанию поставил русскую локаль (1049). Вы можете ставить свою - список можно найти в нете.
В большинстве случаев он вам не понадобится - просто у меня на работе используются две штуки