У меня есть очень простой код Objective- C, который выделяет и инициализирует NSString
, а затем получает UTF-8 const char *
представление этой строки следующим образом:
const char *s = [[[NSString alloc] initWithFormat:@"%s", "£"] UTF8String];
I тогда распечатать шестнадцатеричные значения единиц кода, которые составляют эту строку, используя этот код:
while(*s)
printf("%02x ", (unsigned int) *s++);
, и я получаю следующий вывод:
ffffffc2 ffffffac ffffffc2 ffffffa3
Это неожиданно, так как я бы предположим, что я просто получу ffffffc2 ffffffa3
, поскольку символ £
состоит из двух единиц кода, представленных в шестнадцатеричном виде как c2
, за которым следует a3
, как вы можете см. здесь .
Вот снимок экрана этого вывода в простейшем iOS приложении, которое можно запустить локально на моем ноутбуке:
![Xcode window showing hex output of UTF8 string](https://i.stack.imgur.com/eRTxp.png)
Обратите внимание, что вывод такой же, если я создаю NSString
следующим образом:
[[NSString alloc] initWithFormat:@"%s", "\xc2\xa3"]
Если вместо этого я использую NSString
в качестве аргумента для интерполяции в строку формата, то я получаю ожидаемый результат ffffffc2 ffffffa3
:
[[NSString alloc] initWithFormat:@"%@", @"£"]
Что еще более странно для меня, это то, что точно такой же терпит неудачу Код , как у меня выше (первая версия), кажется, работает так, как я ожидал, когда обнаружил на онлайн-сайте Objective C codepen-type, который вы можете см. Здесь .
Почему дополнительные единицы кода добавляются в представление строки в UTF-8, когда я использую версию кода initWithFormat:@"%s"
, и, по-видимому, только когда я запускаю ее на своем компьютере?