Вопрос по objective-c, ios, iphone, xcode – NSLog выводит символы юникода как мусор при отладке на iPhone

16

EDIT: Вывод NSLog хорошо работает в симуляторе, но не работает при подключении к реальному устройству. И, похоже, это ошибка & # x2014;http://openradar.appspot.com/11148883, Также случается, что это связано с LLDB, переключение Xcode на GDB решает проблему. Либо это возможно для AppCode JetBrain, который хорошо работает с LLDB.


У меня есть куча строк Unicode в приложении, и если я пытаюсь вывести любую из этих строк, используя что-то вродеNSLog(@"%@", aString) тогда все символы ASCII в строке будут напечатаны нормально, но все буквы кириллицы будут перепутаны, поэтому вместо

newLocation: coordinate:60.019584,30.284954 'Удельная'

Я получаю:

newLocation: coordinate:60.019584,30.284954 '–ü–æ–∫–ª–æ–Ω–Ω–æ–≥–æ—Ä—Å–∫–∞—è'

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

Так что мне интересно, есть ли способ заставить NSLog хорошо работать с символами юникода? И я ищу только какую-тоone-liner solutionЯ знаю, что есть несколько способов написать половину страницы кода и вывести символы Юникода, но я ищу что-то более короткое. В идеале я ищу какой-нибудь метод NSString, который заставит все это работать. например

NSLog(@"%@", [aString someThingThatMakesUnicodeWorkWithXcodeConsole]);
Вы уверены, что ваша aString правильно хранит ответ? Судя по тому, что вы опубликовали, я считаю, что aString не правильно сохранил ответ, так что да, когда вы напечатаете его с помощью NSLog, произойдет сбой. Я печатаю греческие символы с NSLog все время. Как вы храните ответ на aString? Lefteris
Откуда берутся струны? Вы читаете их из файла? Когда внутри кода это должно работать. Я протестировал: NSString * s = @ & quot; & # x434; & # x434; & # x435; & # x43B; & # x44C; & # x43D; & # x430; & # x44F; & quot ;; NSLog (@ & quot;% @ & quot ;, s); и это сработало хорошо. Kai Huppmann
Эти данные поступают из файла, но строковый литерал у меня тоже не работает. Но, похоже, я нашел источник & # x2014; он хорошо работает в симуляторе, но выводит мусор при подключении к iPhone, поэтому, возможно, что-то не так с некоторыми настройками. Спасибо. Dmitry Sokurenko

Ваш Ответ

5   ответов
1

NSString *str = [aString UTF8String]
 NSLog(@"%@", str);

Надеюсь это поможет.

Убедитесь, что вам нужно поместить @ в nslog
Нет, он не фиксирует вывод. Dmitry Sokurenko
На самом деле @ & quot;% @ & quot; не будет работать вообще, потому что выходные данные UTFString являются c-строкой и с правильным% & quot;% s & quot; форматировать он будет выводить тот же мусор, что и исходная строка. Dmitry Sokurenko
0

NSLog(@"%@", [NSString stringWithCString:[[places description] cStringUsingEncoding:NSASCIIStringEncoding] encoding:NSNonLossyASCIIStringEncoding]);
4

очевидно, вы можете создать строку, которая будет содержать и выводить кириллические буквы. Когда я изучал Objective-C, у меня была такая же проблема в начале (я также работал с русскими словами и тому подобным). Поэтому решение заключается в том, чтобы преобразовать строку в другой формат следующим образом:

NSString *string = [NSString stringWithCString:"Привет, как дела?" encoding:4];
NSLog(@"%@", string);

или же

NSString *string = [NSString stringWithUTF8String:"Этот вариант короче!"];
NSLog(@"%@", string);

Надеюсь, это поможет вам!

P.S. Это означает, что вам нужно создать строки в виде строк в стиле C и установить для их параметра кодирования значение 4 (UTF-8). Вы можете увидеть весь список доступных параметров в документации к NSStringEncoding в NSString.

Спасибо за ответ, но бывает, что в симуляторе русские строки по умолчанию работают хорошо, и все предложенные решения, включая ваше, также работают. Но когда я подключаю Xcode к реальному устройству, буквы кириллицы выводятся как мусор. Dmitry Sokurenko
@dsokurenko Все должно отображаться правильно, потому что строка в правильной кодировке (только UTF-8 правильно работает с кириллицей).
@dsokurenko К сожалению, я не могу это проверить. Как обстоят дела с локализацией на вашем устройстве? Я действительно не знаю, в чем проблема, но я постараюсь разобраться.
3

это относится к NSLog () и LLDB в некоторых версиях Xcode. Попробуйте одно из следующих решений:

Check log in Xcode Organizer >> Devices >> your device >> Console. Use GDB as your debugger instead of LLDB if you are using the latter one. This can be changed from the schema options. Please refer to the steps in the comment by "cocos2d man" below. Upgrade to Xcode 4.3.2. Some people say it solved this issue, but I haven't confirmed this myself.
@ cocos2dman Извините за недоразумение ... 1, 2, 3 - три решения, но не 3 шага для одного решения. Я меняю цифры с помощью пуль.
В любом случае это правильное решение, но я не могу найти эти опции в органайзере, и после долгого поиска в новом Xcode я обнаружил, что мы можем изменить отладчик из схемы, выполнив следующие шаги: 1-клик на текущей схеме (она находится рядом с кнопка остановки и воспроизведения, а рядом с текущим режимом тестирования, таким как iphone-simulator ...) 2 - выберите параметр & quot; Редактировать схему & quot; 3-Откройте кран & quot; информация & quot; 4-Перейдите в третий раскрывающийся список с именем & quot; отладчик & quot; 5 - измените значение с LLDB на GDB, закройте окно, соберите и запустите снова :)
Спасибо, переход на GDB фактически исправил это. Переключение на 4.3.2 не поможет, потому что я уже использую его. Dmitry Sokurenko
@ Хэлли хорошо, просто я нашел то, что ты говоришь правильно, но не нашел способ, как ты упоминаешь, поэтому я написал то, что написал :)
0

NSLog(@"%@", aString);

EDIT :

Вы можете преобразовать его в строку UTF8. Это может помочь вам.

NSString *str = [aString UTF8String];

Надеюсь это поможет.

-UTF8String дает вам строку C; этоchar*.
Я видел это, но, к сожалению, он не работает, он все равно выводит бессмысленный мусор. Dmitry Sokurenko
@dsokurenko Смотрите часть редактирования.
конечно, я сделал это, просто опечатка в вопросе, в любом случае, спасибо. Dmitry Sokurenko

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