Как отобразить UTF-8 в элементе управления HITextView (MLTE)? - PullRequest
0 голосов
/ 02 февраля 2012

У меня есть строка UTF-8, которую я хочу отобразить в элементе управления HITextView (MLTE).Теоретически, HITextView требует либо «Текст», либо UTF-16, поэтому я конвертирую:

UniChar uniput[STRSIZE];
ByteCount converted,unilen;

err = ConvertFromTextToUnicode(C2UInfo, len, output,
                               kUnicodeUseFallbacksMask, 0, NULL, 0, NULL,
                               sizeof(UniChar)*STRSIZE,
                               &converted, &unilen, uniput);
err=TXNSetData(MessageObject, kTXNUnicodeTextData, uniput, unilen, kTXNEndOffset,
               kTXNEndOffset);

Я определил конвертер C2UInfo следующим образом:

UnicodeMapping    uMapping;
uMapping.unicodeEncoding = CreateTextEncoding(kTextEncodingUnicodeV2_0,
                              kUnicodeCanonicalDecompVariant,
                              kUnicode16BitFormat);
uMapping.otherEncoding = GetTextEncodingBase(kUnicodeUTF8Format);
uMapping.mappingVersion = kUnicodeUseLatestMapping;
err = CreateTextToUnicodeInfo(&uMapping, &C2UInfo);

Это работаетхорошо для простых старых символов ASCII, но многобайтовый UTF-8 отображается на неправильные символы.Например, æ (LATIN SMALL LETTER AE) сопоставляется с 疆 (CJK UNIFIED IDEOGRAPH-7586).

Я попытался установить и снять флажок «Выводить текст в Unicode» в Интерфейсном Разработчикепопытался изменить некоторые из констант преобразования, но безрезультатно.

Он создается с Xcode 3.2.6 с использованием MacOSX10.5.sdk и протестирован в 10.6.

1 Ответ

1 голос
/ 02 февраля 2012

«Текст», которого ожидает ConvertFromTextToUnicode, - это, вероятно, тот же «Текст», который является одним из двух вариантов MLTE.Если бы у вас был вид «Текст», из которого ConvertFromTextToUnicode конвертируется, вы могли бы просто передать его непосредственно в MLTE.

(Для записи «Текст» почти наверняка либо MacRoman, либо что-либо другое, что диктуетсятекущий сценарий, определяемый языком пользователя.)

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

Есть два других способа.

Один из них - создать CFString из UTF-8 , затем Получить его символы .Вы бы сделали это вместо использования TEC.Это функционально эквивалентно и, возможно, немного проще.С другой стороны, вы не сможете повторно использовать конвертер, чего бы это ни стоило.

Другой, поскольку у вас есть HITextView, будет создавать CFString из UTF-8 и просто используйте это .Как и объекты Cocoa, объекты HIToolbox имеют иерархию наследования;поскольку HITextView является разновидностью HIView, HIViewSetText должен просто работать.(А если нет, попробуйте HIViewSetValue.)

Последний метод также значительно приближает вас к возможному переходу от MLTE / HITextView, поскольку по сути это , что вы будете делать с NSTextView..(HITextView и MLTE устарели.)

...