Есть большой файл в utf-8
Стоит задача перегнать файл в другой файл в кодировке Unicode. Функция MultiByteToWideChar декодирует полностью все данные.
Есть ли способ распознать, что переданные данные я декодирую не полностью?
Т.е. к примеру есть строка "Vолгоград" в utf-8 это 17 (1+8*2) символов.
Но при чтении может получиться, что причтается только половина символа. Можно ли как то определить, что переданная в MultiByteToWideChar строка декодировалась не полностью?
Здравствуйте, Shasoft, Вы писали:
S>Есть большой файл в utf-8 S>Стоит задача перегнать файл в другой файл в кодировке Unicode. Функция MultiByteToWideChar декодирует полностью все данные. S>Есть ли способ распознать, что переданные данные я декодирую не полностью? S>Т.е. к примеру есть строка "Vолгоград" в utf-8 это 17 (1+8*2) символов. S>Но при чтении может получиться, что причтается только половина символа. Можно ли как то определить, что переданная в MultiByteToWideChar строка декодировалась не полностью?
странные бывают люди. им даже лень в wiki посмотреть. А там описан нужный алгоритм в статье про utf8
Здравствуйте, Shasoft, Вы писали:
S>Есть большой файл в utf-8 S>Стоит задача перегнать файл в другой файл в кодировке Unicode. Функция MultiByteToWideChar декодирует полностью все данные. S>Есть ли способ распознать, что переданные данные я декодирую не полностью? S>Т.е. к примеру есть строка "Vолгоград" в utf-8 это 17 (1+8*2) символов. S>Но при чтении может получиться, что причтается только половина символа. Можно ли как то определить, что переданная в MultiByteToWideChar строка декодировалась не полностью?
Изучение MSDN дало флаг MB_ERR_INVALID_CHARS. Если у нас получается "половина" символа, то функция возвращает ошибку. Так что решение есть. Если вернуло ошибку, то передаем в функцию размер на 1 меньше до тех пор пока не вернутся декодированные данные. Плохо то, что каждый раз приходится на декодирование передавать всю строку целиком, но у меня буфер будет не большой, так что тормозов из-за этого наблюдаться не будет.
Здравствуйте, Сергей Мухин, Вы писали: СМ>странные бывают люди. им даже лень в wiki посмотреть. А там описан нужный алгоритм в статье про utf8
Вижу, вы человек не странный, может укажите где именно в вики написано про алгоритм преобразования из utf8 в Unicode по частям с помощью функции MultiByteToWideChar? Я к сожалению не нашел. Там вроде только описание самого utf-8.
Здравствуйте, Shasoft, Вы писали:
S>Здравствуйте, Сергей Мухин, Вы писали: СМ>>странные бывают люди. им даже лень в wiki посмотреть. А там описан нужный алгоритм в статье про utf8
S>Вижу, вы человек не странный, может укажите где именно в вики написано про алгоритм преобразования из utf8 в Unicode по частям с помощью функции MultiByteToWideChar? Я к сожалению не нашел. Там вроде только описание самого utf-8.
там написано как определить, как найти границу символа
Здравствуйте, Сергей Мухин, Вы писали: СМ>там написано как определить, как найти границу символа
Там дан алгоритм общий для utf-8. Я же спрашивал, применительно к функции MultiByteToWideChar. Т.е. какие-то флаги или другая функция. Т.е. меня интересовала практическая реализация на WinApi.
Здравствуйте, Shasoft, Вы писали:
S>Здравствуйте, Сергей Мухин, Вы писали: СМ>>там написано как определить, как найти границу символа S>Там дан алгоритм общий для utf-8. Я же спрашивал, применительно к функции MultiByteToWideChar. Т.е. какие-то флаги или другая функция. Т.е. меня интересовала практическая реализация на WinApi.
Здравствуйте, Сергей Мухин, Вы писали: S>>Здравствуйте, Сергей Мухин, Вы писали: СМ>>>там написано как определить, как найти границу символа S>>Там дан алгоритм общий для utf-8. Я же спрашивал, применительно к функции MultiByteToWideChar. Т.е. какие-то флаги или другая функция. Т.е. меня интересовала практическая реализация на WinApi. СМ>что с битами не умем работать?
Умею. Просто я не хочу реализовывать сам этот алгоритм сам с учетом того, что есть готовая функция winapi.
Вопрос я уже решил. Спасибо за внимание.
p.s. Следующий раз читайте сообщение, прежде чем отвечать.
Здравствуйте, Сергей Мухин, Вы писали: СМ>Здравствуйте, Shasoft, Вы писали: S>>Умею. Просто я не хочу реализовывать сам этот алгоритм СМ>супер! проверить пару битов теперь называется "реализовывать алгоритм" S>>Вопрос я уже решил. Спасибо за внимание. СМ>молодец, а можно взглянуть? S>>p.s. Следующий раз читайте сообщение, прежде чем отвечать. СМ>дык. ставится задача "Есть большой файл в utf-8/ Стоит задача перегнать файл в другой файл в кодировке Unicode" СМ>так вам ехать или шашечки? файл декодировать или функцию MultiByteToWideChar использовать?
Сейчас как раз идут "шашечки".
Я сначало libiconv прикрутил для преобразования. Но потом решил, что DLL-ка в 1 Мб — это слишком много для преобразования. Поэтому решил обойтись функцией MultiByteToWideChar, т.к. она реализована в windows штатно. А реализовать сам я не хочу по причине того, что теоретически могут быть и другие кодировки мультибайтные. Реализовать каждую руками — муторное дело.
Решение решение задачи: "Изучение MSDN дало флаг MB_ERR_INVALID_CHARS".
Здравствуйте, Shasoft, Вы писали:
S>Сейчас как раз идут "шашечки". S>Я сначало libiconv прикрутил для преобразования. Но потом решил, что DLL-ка в 1 Мб — это слишком много для преобразования. Поэтому решил обойтись функцией MultiByteToWideChar, т.к. она реализована в windows штатно. А реализовать сам я не хочу по причине того, что теоретически могут быть и другие кодировки мультибайтные. Реализовать каждую руками — муторное дело. S>Решение решение задачи: "Изучение MSDN дало флаг MB_ERR_INVALID_CHARS".
не уверен, что этот код выдается только в нужном вам случае.
Здравствуйте, Сергей Мухин, Вы писали: S>>Решение решение задачи: "Изучение MSDN дало флаг MB_ERR_INVALID_CHARS". СМ>не уверен, что этот код выдается только в нужном вам случае.
Как оказалось, ошибка выдается при указании маленького буфера под Unicode строку.
Т.е. если на вход подать 10 utf-8 символов, а на выход буфер из 9 символов, то вернется ошибка. Хотя это всё влегкую обходится.
Здравствуйте, Shasoft, Вы писали:
S>Есть большой файл в utf-8 S>Стоит задача перегнать файл в другой файл в кодировке Unicode. Функция MultiByteToWideChar декодирует полностью все данные. S>Есть ли способ распознать, что переданные данные я декодирую не полностью? S>Т.е. к примеру есть строка "Vолгоград" в utf-8 это 17 (1+8*2) символов. S>Но при чтении может получиться, что причтается только половина символа. Можно ли как то определить, что переданная в MultiByteToWideChar строка декодировалась не полностью?
Можете попробовать это — IMultiLanguage2::ConvertStringInIStream.