А как же тогда защититься от нулевых байтов в UTF-8? Ведь первый из них будет принят за терминальный. Или в этом коде запрещены нулевые байты?WinMain писал(а):И ты считаешь это удачным решением задачи? Если строку в виде std::string наращивать посимвольно, то это приведёт к жудким тормозам при выполнении программы. На коротких строках это может и незаметно будет, но на более длинных текстах программа будет просто умирать.
Не получается приведение
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Нифига подобного. Работает и с вязью, и с кириллицей и ничего не усекается, что показывают и тесты, и элементарнейший анализ.Romeo писал(а):Не работает с кириллицей. Вместо русских букв будут вставлены усечённые до одного байта ASCII символы с неожиданным значением.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Кириллица, плохой пример. Но можно подобрать символы, которые будет с нулевым байтом.Нифига подобного. Работает и с вязью, и с кириллицей и ничего не усекается, что показывают и тесты, и элементарнейший анализ.
Если ты защитишься от нулевых байтов путём их удаления (как у тебя сейчас сделано), то ты исковеркаешь текст. Нулевые байты нужно оставлять, они тоже несут смысловую нагрузку в UTF.А как же тогда защититься от нулевых байтов в UTF-8? Ведь первый из них будет принят за терминальный. Или в этом коде запрещены нулевые байты?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
В кодировке UTF-8 нет нулевых байтов между символами (кроме последнего в конце строки).
В отличие от обычной UNICODE-строки, где каждый символ кодируется строго двумя байтами, в кодировке UTF-8 символы латиницы (с кодом до 127) кодируются одним байтом, а символы других алфавитов - двумя или четырьмя байтами. И ни один из этих байтов не должен быть нулевым. К сведению: в кодировке UTF-8 буква "Ё" кодируется четырьмя! байтами.
В отличие от обычной UNICODE-строки, где каждый символ кодируется строго двумя байтами, в кодировке UTF-8 символы латиницы (с кодом до 127) кодируются одним байтом, а символы других алфавитов - двумя или четырьмя байтами. И ни один из этих байтов не должен быть нулевым. К сведению: в кодировке UTF-8 буква "Ё" кодируется четырьмя! байтами.
У меня совсем не так сделано, я как раз копирую каждый байт.Romeo писал(а):Если ты защитишься от нулевых байтов путём их удаления (как у тебя сейчас сделано), то ты исковеркаешь текст. Нулевые байты нужно оставлять, они тоже несут смысловую нагрузку в UTF.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
При этом первый байт префиксный и заведомо ноля не содержит, так как признак следующего байта - первый больше 127. А второй может быть нулевым? Или третий? Или четвёртый?WinMain писал(а):В отличие от обычной UNICODE-строки, где каждый символ кодируется строго двумя байтами, в кодировке UTF-8 символы латиницы (с кодом до 127) кодируются одним байтом, а символы других алфавитов - двумя или четырьмя байтами.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Похоже мои интуитивные знания UTF-8 спутались со стандартом UTF-16. Если внутренних нулей не бывает, то и подход с вектором символов, ровно как и побайтное копирование, не нужны.WinMain писал(а):В кодировке UTF-8 нет нулевых байтов между символами (кроме последнего в конце строки).
В отличие от обычной UNICODE-строки, где каждый символ кодируется строго двумя байтами, в кодировке UTF-8 символы латиницы (с кодом до 127) кодируются одним байтом, а символы других алфавитов - двумя или четырьмя байтами. И ни один из этих байтов не должен быть нулевым. К сведению: в кодировке UTF-8 буква "Ё" кодируется четырьмя! байтами.
Я только что внимательно изучил стандарт UTF-8. Судя по всему третий и четрвёртый тоже не могут быть нулевыми.Сионист писал(а):При этом первый байт префиксный и заведомо ноля не содержит, так как признак следующего байта - первый больше 127. А второй может быть нулевым? Или третий? Или четвёртый?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Код: Выделить всё
int main()
{
std::string s="";
s+='\0';
s+='\0';
s+='\0';
s+='\0';
s+='\0';
s+='\0';
std::cout<<s.length()<<std::endl;
return 0;
}
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Прочитал по ссылке, там у всех байтов префиксы, начинающиеся с единичного бита, так что нулевых быть ещё и не может.
Код: Выделить всё
std::string WStringToUtf8 (const
std::wstring &s )
{
char *Buffer;
size_t BufferSize;
std::string Result="";
if (!s.empty())
{
BufferSize=WideCharToMultiByte(CP_UTF8, 0, s.c_str(), s.length(), NULL, 0, NULL, NULL);
Buffer=new char[BufferSize]+1;
if (Buffer!=NULL)
{
WideCharToMultiByte(CP_UTF8, 0, s.c_str(), s.length(), Buffer, BufferSize, NULL, NULL);
Buffer[BufferSize]=0;
Result=Buffer;
delete [] Buffer;
}
}
return Result;
}
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Так вот почему проект "Ё-мобиль" у Михаила Прохорова не состоялся - не ту кодировку использовали. :-)К сведению: в кодировке UTF-8 буква "Ё" кодируется четырьмя! байтами.
А вообще-то данная тема уже когда-то поднималась на форуме.
Вот ссылка на неё.
Поумнеть несложно, куда труднее от дури избавиться.