utf-8 => Unicode по частям
От: Shasoft Россия http://shasoft.com
Дата: 20.01.13 14:44
Оценка: -1
Есть большой файл в utf-8
Стоит задача перегнать файл в другой файл в кодировке Unicode. Функция MultiByteToWideChar декодирует полностью все данные.
Есть ли способ распознать, что переданные данные я декодирую не полностью?
Т.е. к примеру есть строка "Vолгоград" в utf-8 это 17 (1+8*2) символов.
Но при чтении может получиться, что причтается только половина символа. Можно ли как то определить, что переданная в MultiByteToWideChar строка декодировалась не полностью?
Re: utf-8 => Unicode по частям
От: Сергей Мухин Россия  
Дата: 20.01.13 14:51
Оценка: 3 (1)
Здравствуйте, Shasoft, Вы писали:

S>Есть большой файл в utf-8

S>Стоит задача перегнать файл в другой файл в кодировке Unicode. Функция MultiByteToWideChar декодирует полностью все данные.
S>Есть ли способ распознать, что переданные данные я декодирую не полностью?
S>Т.е. к примеру есть строка "Vолгоград" в utf-8 это 17 (1+8*2) символов.
S>Но при чтении может получиться, что причтается только половина символа. Можно ли как то определить, что переданная в MultiByteToWideChar строка декодировалась не полностью?

странные бывают люди. им даже лень в wiki посмотреть. А там описан нужный алгоритм в статье про utf8
---
С уважением,
Сергей Мухин
Re: utf-8 => Unicode по частям
От: Shasoft Россия http://shasoft.com
Дата: 20.01.13 15:00
Оценка: -1 :)
Здравствуйте, Shasoft, Вы писали:

S>Есть большой файл в utf-8

S>Стоит задача перегнать файл в другой файл в кодировке Unicode. Функция MultiByteToWideChar декодирует полностью все данные.
S>Есть ли способ распознать, что переданные данные я декодирую не полностью?
S>Т.е. к примеру есть строка "Vолгоград" в utf-8 это 17 (1+8*2) символов.
S>Но при чтении может получиться, что причтается только половина символа. Можно ли как то определить, что переданная в MultiByteToWideChar строка декодировалась не полностью?

Изучение MSDN дало флаг MB_ERR_INVALID_CHARS. Если у нас получается "половина" символа, то функция возвращает ошибку. Так что решение есть. Если вернуло ошибку, то передаем в функцию размер на 1 меньше до тех пор пока не вернутся декодированные данные. Плохо то, что каждый раз приходится на декодирование передавать всю строку целиком, но у меня буфер будет не большой, так что тормозов из-за этого наблюдаться не будет.
Re[2]: utf-8 => Unicode по частям
От: Shasoft Россия http://shasoft.com
Дата: 20.01.13 15:04
Оценка: -2
Здравствуйте, Сергей Мухин, Вы писали:
СМ>странные бывают люди. им даже лень в wiki посмотреть. А там описан нужный алгоритм в статье про utf8

Вижу, вы человек не странный, может укажите где именно в вики написано про алгоритм преобразования из utf8 в Unicode по частям с помощью функции MultiByteToWideChar? Я к сожалению не нашел. Там вроде только описание самого utf-8.
Re[3]: utf-8 => Unicode по частям
От: Сергей Мухин Россия  
Дата: 20.01.13 15:22
Оценка:
Здравствуйте, Shasoft, Вы писали:

S>Здравствуйте, Сергей Мухин, Вы писали:

СМ>>странные бывают люди. им даже лень в wiki посмотреть. А там описан нужный алгоритм в статье про utf8

S>Вижу, вы человек не странный, может укажите где именно в вики написано про алгоритм преобразования из utf8 в Unicode по частям с помощью функции MultiByteToWideChar? Я к сожалению не нашел. Там вроде только описание самого utf-8.


там написано как определить, как найти границу символа
---
С уважением,
Сергей Мухин
Re[4]: utf-8 => Unicode по частям
От: Shasoft Россия http://shasoft.com
Дата: 20.01.13 15:44
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:
СМ>там написано как определить, как найти границу символа
Там дан алгоритм общий для utf-8. Я же спрашивал, применительно к функции MultiByteToWideChar. Т.е. какие-то флаги или другая функция. Т.е. меня интересовала практическая реализация на WinApi.
Re[5]: utf-8 => Unicode по частям
От: Сергей Мухин Россия  
Дата: 20.01.13 18:58
Оценка: -1
Здравствуйте, Shasoft, Вы писали:

S>Здравствуйте, Сергей Мухин, Вы писали:

СМ>>там написано как определить, как найти границу символа
S>Там дан алгоритм общий для utf-8. Я же спрашивал, применительно к функции MultiByteToWideChar. Т.е. какие-то флаги или другая функция. Т.е. меня интересовала практическая реализация на WinApi.

что с битами не умем работать?
---
С уважением,
Сергей Мухин
Re[6]: utf-8 => Unicode по частям
От: Shasoft Россия http://shasoft.com
Дата: 20.01.13 20:42
Оценка: -1
Здравствуйте, Сергей Мухин, Вы писали:
S>>Здравствуйте, Сергей Мухин, Вы писали:
СМ>>>там написано как определить, как найти границу символа
S>>Там дан алгоритм общий для utf-8. Я же спрашивал, применительно к функции MultiByteToWideChar. Т.е. какие-то флаги или другая функция. Т.е. меня интересовала практическая реализация на WinApi.
СМ>что с битами не умем работать?
Умею. Просто я не хочу реализовывать сам этот алгоритм сам с учетом того, что есть готовая функция winapi.

Вопрос я уже решил. Спасибо за внимание.

p.s. Следующий раз читайте сообщение, прежде чем отвечать.
Re[7]: utf-8 => Unicode по частям
От: Сергей Мухин Россия  
Дата: 20.01.13 21:16
Оценка:
Здравствуйте, Shasoft, Вы писали:

S>Умею. Просто я не хочу реализовывать сам этот алгоритм


супер! проверить пару битов теперь называется "реализовывать алгоритм"

S>Вопрос я уже решил. Спасибо за внимание.


молодец, а можно взглянуть?

S>p.s. Следующий раз читайте сообщение, прежде чем отвечать.


дык. ставится задача "Есть большой файл в utf-8/ Стоит задача перегнать файл в другой файл в кодировке Unicode"

так вам ехать или шашечки? файл декодировать или функцию MultiByteToWideChar использовать?
---
С уважением,
Сергей Мухин
Re[8]: utf-8 => Unicode по частям
От: Shasoft Россия http://shasoft.com
Дата: 20.01.13 21:24
Оценка: -1
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, Shasoft, Вы писали:
S>>Умею. Просто я не хочу реализовывать сам этот алгоритм
СМ>супер! проверить пару битов теперь называется "реализовывать алгоритм"
S>>Вопрос я уже решил. Спасибо за внимание.
СМ>молодец, а можно взглянуть?
S>>p.s. Следующий раз читайте сообщение, прежде чем отвечать.
СМ>дык. ставится задача "Есть большой файл в utf-8/ Стоит задача перегнать файл в другой файл в кодировке Unicode"
СМ>так вам ехать или шашечки? файл декодировать или функцию MultiByteToWideChar использовать?

Сейчас как раз идут "шашечки".
Я сначало libiconv прикрутил для преобразования. Но потом решил, что DLL-ка в 1 Мб — это слишком много для преобразования. Поэтому решил обойтись функцией MultiByteToWideChar, т.к. она реализована в windows штатно. А реализовать сам я не хочу по причине того, что теоретически могут быть и другие кодировки мультибайтные. Реализовать каждую руками — муторное дело.
Решение решение задачи: "Изучение MSDN дало флаг MB_ERR_INVALID_CHARS".
Re[9]: utf-8 => Unicode по частям
От: Сергей Мухин Россия  
Дата: 21.01.13 04:30
Оценка:
Здравствуйте, Shasoft, Вы писали:

S>Сейчас как раз идут "шашечки".

S>Я сначало libiconv прикрутил для преобразования. Но потом решил, что DLL-ка в 1 Мб — это слишком много для преобразования. Поэтому решил обойтись функцией MultiByteToWideChar, т.к. она реализована в windows штатно. А реализовать сам я не хочу по причине того, что теоретически могут быть и другие кодировки мультибайтные. Реализовать каждую руками — муторное дело.
S>Решение решение задачи: "Изучение MSDN дало флаг MB_ERR_INVALID_CHARS".

не уверен, что этот код выдается только в нужном вам случае.
---
С уважением,
Сергей Мухин
Re[10]: utf-8 => Unicode по частям
От: Shasoft Россия http://shasoft.com
Дата: 21.01.13 04:42
Оценка: -1
Здравствуйте, Сергей Мухин, Вы писали:
S>>Решение решение задачи: "Изучение MSDN дало флаг MB_ERR_INVALID_CHARS".
СМ>не уверен, что этот код выдается только в нужном вам случае.
Как оказалось, ошибка выдается при указании маленького буфера под Unicode строку.
Т.е. если на вход подать 10 utf-8 символов, а на выход буфер из 9 символов, то вернется ошибка. Хотя это всё влегкую обходится.
Re: utf-8 => Unicode по частям
От: mssmax  
Дата: 21.01.13 09:00
Оценка: 3 (1)
Здравствуйте, Shasoft, Вы писали:

S>Есть большой файл в utf-8

S>Стоит задача перегнать файл в другой файл в кодировке Unicode. Функция MultiByteToWideChar декодирует полностью все данные.
S>Есть ли способ распознать, что переданные данные я декодирую не полностью?
S>Т.е. к примеру есть строка "Vолгоград" в utf-8 это 17 (1+8*2) символов.
S>Но при чтении может получиться, что причтается только половина символа. Можно ли как то определить, что переданная в MultiByteToWideChar строка декодировалась не полностью?

Можете попробовать это — IMultiLanguage2::ConvertStringInIStream.

MS.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.