Как в кодировке UTF-8 символ / строка - PullRequest
5 голосов
/ 22 февраля 2011

Я использую библиотеку API Twitter для публикации статуса в Twitter.Twitter требует, чтобы сообщение было в кодировке UTF-8.Библиотека содержит функцию, которая URL кодирует стандартную строку, которая отлично работает для всех специальных символов, таких как! @ # $% ^ & * (), Но является неправильной кодировкой для символов с акцентом (и других UTF-8).

Например, 'é' преобразуется в «% E9», а не в «% C3% A9» (оно в значительной степени преобразуется только в шестнадцатеричное значение).Есть ли встроенная функция, которая может вводить что-то вроде 'é' и возвращать что-то вроде '% C9% A9 "?

edit: я довольно новичок в UTF-8 на случай, если то, что я запрашиваю, не даетсмысл.

редактировать: если у меня есть

string foo = "bar é";

, я хотел бы преобразовать его в

"bar %C3%A9"

Спасибо

Ответы [ 2 ]

6 голосов
/ 22 февраля 2011

Чтобы понять, что нужно сделать, вы должны сначала понять немного фона. Разные кодировки используют разные значения для «одного и того же» символа. Например, Latin-1 говорит, что «é» - это один байт со значением E9 (hex), в то время как UTF-8 говорит, что «é» - это двухбайтовая последовательность C3 A9, и, тем не менее, UTF-16 говорит, что один и тот же символ является единственным двухбайтовое значение 00E9 - одно 16-битное значение, а не два 8-битных, как в UTF-8. (Unicode, который не является кодировкой, фактически использует то же значение кодовой точки, U + E9, что и Latin-1.)

Для преобразования из одной кодировки в другую сначала необходимо принять закодированное значение, декодировать его до значения, не зависящего от исходной кодировки (т. Е. Кодовой точки Unicode), а затем перекодировать его в целевую кодировку. Если целевая кодировка не поддерживает все кодовые точки исходной кодировки, вам нужно либо перевести, либо иным образом обработать это условие.

Этот шаг перекодировки требует знания как исходного, так и целевого кодировок.

Ваша функция API не конвертирование кодировок; кажется, что URL-экранирует произвольную строку байтов. Авторы функции, по-видимому, предполагают, что уже будет преобразовано в UTF-8.

Чтобы выполнить преобразование в UTF-8, вы должны знать, какую кодировку использует ваша система, и уметь сопоставлять кодовые точки Unicode. Оттуда кодировка UTF-8 становится тривиальной.

В зависимости от вашей системы это может быть так же просто, как преобразование «родного» набора символов (который для вас имеет «é» как E9, так что, вероятно, Windows-1252, Latin-1 или что-то очень похожее) в широкие символы (что, вероятно, UTF-16 или UCS-2, если sizeof (wchar_t) равно 2, или UTF-32, если sizeof (wchar_t) равно 4), а затем в UTF-8. Wcstombs, как отвечает Мартин, может справиться со второй частью этого преобразования, но это зависит от системы. Однако я считаю, что Latin-1 является подмножеством Unicode, поэтому преобразование из этой исходной кодировки может пропустить шаг широких символов. Windows-1252 близка к Latin-1, но заменяет некоторые управляющие символы печатными символами.

6 голосов
/ 22 февраля 2011

Если у вас есть строка широких символов, вы можете кодировать ее в UTF8 с помощью стандартной функции wcstombs () .Если у вас есть код в другой кодировке (например, Latin-1), вам сначала нужно будет декодировать его в широкую строку.

Редактировать: ... но wcstombs () зависит от вашегонастройки локали, и похоже, что вы не можете выбрать локаль UTF8 в Windows .(Вы не говорите, какую ОС используете.) WideCharToMultiByte () может быть более полезным в Windows, так как вы можете указать кодировку в вызове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...