Рейтинг:
2
Jochen Arndt
Вы используете один и тот же буфер для ввода и вывода. Это не сработает. См. Функция MultiByteToWideChar (Windows)[^].
Так и должно быть:
int nSize = MultiByteToWideChar(nlanguageCodePage, 0, chAnsiBuf, -1, NULL, NULL);
LPWSTR sUnicodeBuf = new WCHAR[nSize];
MultiByteToWideChar(nlanguageCodePage, 0, chAnsiBuf, -1, sUnicodeBuff, nSize);
// Use sUnicodeBuff here
delete [] sUniocodeBuff;
Однако при фиксированном размере входного буфера ANSI он также может быть использован для выходного буфера, поскольку строка Unicode никогда не будет иметь более широких символов, чем количество символов ANSI во входной строке:
WCHAR wUnicodeBuf[NMLANG_MaxNBuf];
while (fgets(chAnsiBuff, NMLANG_MaxNBuf, pFile) != NULL)
{
MultiByteToWideChar(nlanguageCodePage, 0, chAnsiBuf, -1, wUnicodeBuff, NMLANG_MaxNBuf);
// bom at starting
if (nBOM == 0) { arcOut.Write(&bom, 2); }
arcOut.WriteString(wUnicodeBuff);
nBOM++;
}
Это должно сработать. Если результат не такой, как ожидалось, проверьте другие задействованные функции, такие как
arcOut.WriteString()
, если спецификация верна и если ваш входной файл действительно закодирован с помощью кодовой страницы
nlanguageCodePage
.
[РЕДАКТИРОВАТЬ]
Другим возможным источником может быть
arcOut.WriteString()
вызовите, когда он преобразует строку Unicode обратно в ANSI. Затем вы можете использовать вместо этого двоичную запись:
int len = MultiByteToWideChar(nlanguageCodePage, 0, chAnsiBuf, -1, wUnicodeBuff, NMLANG_MaxNBuf);
// bom at starting
if (nBOM == 0) { arcOut.Write(&bom, 2); }
if (len > 0)
arcOut.Write(wUnicodeBuff, len * sizeof(WCHAR));
nBOM++;
[/РЕДАКТИРОВАТЬ]
Member 12677926
пожалуйста, вы можете сделать один образец и дайте мне знать ,если он работает. пожалуйста
Member 12677926
спасибо...и дайте любые образцы
Jochen Arndt
Вы должны дать более подробное описание проблемы ("не работает так, как ожидалось", ничего не говорит другим).
Я довольно часто использовал MultiByteToWideChar и никогда не имел проблем (но пока не с ивритом). Поэтому я ожидаю, что источник ошибки где-то еще.
Возвращает ли функция MultiByteToWideChar () ошибку или содержимое файла не соответствует ожиданиям?
Каково значение nlanguageCodePage?
Как определяется функция WriteString ()? Это библиотечная функция или написанная вами?
Я спрашиваю об этом потому, что эта функция может преобразовать переданную строку обратно в ANSI, используя текущую кодовую страницу. Если это так, используйте двоичную запись:
аркут.Писать(wUnicodeBuf, length_returned_by_MultiByteToWidechar);
Я обновлю свой ответ по этому поводу.
Наконец, вы можете привести короткий пример (строка текста на иврите, соответствующий шестнадцатеричный дамп и шестнадцатеричный дамп из выходного файла).
Member 12677926
я портировался на Unicode translator ...от ANSI ... до того, как они используют was, они будут держать локаль как иврит, и это показывает разные символы, а файл Unicode показывает другой текст.
Member 12677926
у меня есть файл ansi, в котором некоторые еврейские символы есть и раньше ... как показано ниже
ID_TEST ="כיצד מתחברים למצוא לקבוע חריץ באם נחוץ"
когда я преобразовал его в Unicode, он показывал те же символы, что и ANSI, что означает выше, что и символы ANSI, и символы unicode одинаковы ... но когда раньше, когда они держали язык как иврит, это было совсем по-другому... иврит как локаль и свернутая строка из ansi в Unicode-это не одно и то же ....
Member 12677926
поскольку теперь я портирован на Unicode, нет необходимости сохранять локаль ... когда мы преобразуем ANSI в Unicode ..wether в unicode он покажет правильные символы, то есть отличные от ANSI или одинаковые
ID_TEST = как вы подключаетесь? При необходимости вы можете указать Дадо или корректировку
Это мой тест по английскому ..
Member 12677926
я сомневаюсь, что во время преобразования из ANSI в unicode будет ли один и тот же текст отображаться в unicode или правильно ..text ? пожалуйста, помогите мне
Jochen Arndt
Появиться где?
Из вашей программы вы можете распечатать текст в Юникоде, используя функцию печати с поддержкой юникода (или просто любую, если ваше приложение построено как Юникод).
Созданный файл будет (или должен) быть Unicode. Таким образом, вы должны использовать средство просмотра или редактор, который поддерживает файлы Unicode.
Чтобы проверить файлы, используйте шестнадцатеричный редактор. Файлы ANSI и Unicode совершенно разные для одного и того же текста.
Member 12677926
iam получение данных как для ansi, так и для unicode IAM преобразование из ansi в unicode-это кодовая страница 1255 правильно?
Member 12677926
кодовая страница языка файла ansi просто основана на имени файла iam, принимающем кодовую страницу языка...
Jochen Arndt
Так что же это за число?
Для иврита я бы ожидал 1255 (Windows) или 28598/38598 (ISO).
Но вы должны знать приложение, создавшее файл (например, выбранную системную кодовую страницу Windows при создании файла). Нет никакого решения, чтобы определить кодовую страницу файлы в кодировке ANSI. Это должно быть известно.
Member 12677926
да ...я жестко закодировал эту ... часть ... она идет 1255, но ... все та же проблема
Member 12677926
пожалуйста, помогите мне
Jochen Arndt
Пожалуйста, разместите первые шестнадцатеричные байты входного и выходного файла. Видя это, вы должны понять, что происходит не так.
Пример:
Еврейская буква ALEF имеет код 0xE0 на кодовой странице 1255.
Соответствующая кодовая точка Unicode (UTF16-LE) равна 0x05D0.
Поэтому, если вы создаете входной файл с одним байтом 0xE0, выходной файл должен содержать 0xFF 0xFE 0xD0 0x05.
Чтобы проверить теперь, где происходит сбой, создайте такой входной файл (или используйте постоянную строку для тестирования вместо чтения из файла), выполните преобразование, проверьте содержимое строки Unicode (байты 0xD0 и 0x05) и, наконец, проверьте содержимое выходного файла.
Member 12677926
для входного файла я получил e0 для входного файла