Как преобразовать строку Unicode в строку utf-16 или utf-8?

Если вы хотите установить дизайн интерфейса пользователя на определенный элемент управления или макет. Например, запись или кнопка. Вы можете использовать пользовательское средство визуализации.

Пользовательские средства визуализации предоставляют мощный подход для настройки внешнего вида и поведения элементов управления Xamarin.Forms. Их можно использовать для небольших изменений стиля или сложной настройки макета и поведения платформы. Эта статья представляет собой введение в настраиваемые средства визуализации и описывает процесс создания настраиваемого средства визуализации.

blockquote>

И вы можете использовать DependencyService, если вы просто хотите вызвать какой-то собственный API.

DependencyService позволяет приложениям вызывать специфические для платформы функции из общего кода. Эта функциональность позволяет приложениям Xamarin.Forms делать все, что может делать нативное приложение.

blockquote>

И вы также можете использовать Effects . В некоторых случаях все три могут помочь вам реализовать ваши требования.

Есть несколько соответствующих случаев, которые используют один из них для решения проблемы. Я надеюсь, что они могут помочь вам лучше понять их различия и использование, и как выбрать их в качестве решения в конкретных случаях.

Случай CustomRenderer

Случай DependencyService

Случай эффекта

6
задан BlaM 13 November 2008 в 18:05
поделиться

4 ответа

Короткий ответ:

Никакое преобразование не потребовало при использовании строк Unicode, таких как CString или wstring. Используйте sqlite3_open16 (). Необходимо будет удостовериться, что Вы передаете указатель WCHAR (литой к void *. Кажется Ламе! Даже если этот lib является кросс-платформенным, я предполагаю, что они, возможно, определили широкий символьный тип, который зависит от платформы и менее недружелюбен, чем a void *) к API. Такой что касается CString: (void*)(LPCWSTR)strFilename

Более длинный ответ:

У Вас нет строки Unicode, которую Вы хотите преобразовать в UTF8 или UTF16. Вам представили строку Unicode в Вашей программе с помощью данного кодирования: Unicode не является двоичным представлением по сути. Кодировка говорит, как кодовые точки Unicode (численные значения) представлены в памяти (двоичное расположение числа). UTF8 и UTF16 являются наиболее широко используемой кодировкой. Они очень отличаются все же.

Когда в проекте VS говорится "набор символов Unicode", это на самом деле означает, что "символы кодируются как UTF16". Поэтому можно использовать sqlite3_open16 () непосредственно. Никакое преобразование не требуется. Символы хранятся в типе WCHAR (в противоположность char) который берет 16 битов (Fallsback по стандарту C тип wchar_t, который берет 16 битов на Win32. Могло бы отличаться на других платформах. Спасибо за исправление, Средства проверки).

Существует еще одна деталь, на которую Вы могли бы хотеть обратить внимание: UTF16 существует в 2 разновидностях: и Прямой порядок байтов С обратным порядком байтов. Это - порядок байтов этих 16 битов. Прототип функции, которого Вы даете для UTF16, не говорит, какое упорядочивание используется. Но Вы - довольно безопасное предположение, что sqlite использует тот же порядок байтов в качестве Windows (IIRC С прямым порядком байтов. Я знаю порядок, но всегда имел проблему с именами :-)).

Править: Ответьте для комментария Средствами проверки:

UTF16 использует элементы кода на 16 битов. Под Win32 (и только на Win32), wchar_t используется для такого устройства хранения данных. Прием - то, что некоторые символы Unicode требуют последовательности 2 таких элементов кода на 16 битов. Их называют Суррогатными парами.

Тем же путем UTF8 представляет 1 символ с помощью 1-4-байтовой последовательности. Все же UTF8 используются с char ввести.

7
ответ дан 8 December 2019 в 13:03
поделиться

Все строковые типы C++ являются нейтральным набором символов. Они просто обосновываются на ширине символов и не делают дальнейших предположений. wstring использует 16-разрядные символы в Windows, соответствующем примерно к utf-16, но он все еще зависит от того, что Вы храните в потоке. wstring всегда не осуществляет это данные, Вы вставляете его, должен быть допустимый utf16. Windows использует utf16, когда UNICODE определяется, хотя, таким образом, скорее всего, Ваши строки уже utf16, и Вы ничего не должны делать.

Немногие другие предложили использовать функцию WideCharToMultiByte, которая является (один из) путем (путями) пойти для преобразования utf16 в utf8. Но так как sqlite может обработать utf16, который не должен быть необходимым.

3
ответ дан 8 December 2019 в 13:03
поделиться

utf-8 и utf-16 являются оба "unicode" кодировками символов. То, о чем Вы, вероятно, говорите, является utf-32, который является кодировкой символов фиксированного размера. Возможно, поиск

"Convert utf-32 into utf-8 or utf-16"

предоставляет Вам некоторые результаты или другие статьи об этом.

0
ответ дан 8 December 2019 в 13:03
поделиться

Используйте функцию WideCharToMultiByte. Указать CP_UTF8 для CodePage параметр.

CHAR buf[256]; // or whatever
WideCharToMultiByte(
  CP_UTF8, 
  0, 
  StringToConvert, // the string you have
  -1, // length of the string - set -1 to indicate it is null terminated
  buf, // output
  __countof(buf), // size of the buffer in bytes - if you leave it zero the return value is the length required for the output buffer
  NULL,    
  NULL
);

Кроме того, кодировка по умолчанию для unicode приложений в окнах является UTF-16LE, таким образом, Вы, возможно, не должны были бы выполнять любой перевод и просто использовать вторую версию sqlite3_open16.

8
ответ дан 8 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: