Символ C вопрос о кодировании со знаком/неподписанного

Я считал, что C не определяют, если символ подписывается или не подписан, и на странице GCC это говорит, что может быть подписано на x86 и неподписанное в PowerPPC и ARM.

Okey, я пишу программу с БОЙКИМИ, которые определяют символ как gchar (не больше, чем он, только путь к стандартизации).

Мой вопрос, что относительно UTF-8? Это использует больше, чем блок памяти?

Скажите, что у меня есть переменная

неподписанный символ *представляет в виде строки = "Моя строка с UTF8 enconding ~> çã";

Посмотрите, если я объявляю свою переменную как

неподписанный

У меня будет только 127 значений (так мое желание программы сохранить больше блоков мадам), или UTF-8 изменяются на отрицание также?

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

Примечание: Спасибо за весь ответ

Я не понимаю, как это обычно интерпретируется.

Я думаю, что как ASCII, если у меня есть и неподписанный символ со знаком на моей программе, строки имеют по-другому значения, и это ведет, чтобы перепутать, вообразить это в utf8 так.

10
задан msw 26 March 2010 в 15:14
поделиться

7 ответов

Использование беззнаковых символов имеет свои плюсы и минусы. Самым большим преимуществом является то, что вы не получаете расширение знака или другие забавные функции, такие как подписанное переполнение, которое привело бы к неожиданным результатам расчетов. Unsigned char также совместим с макросами / функциями , такими как isalpha (ch) (все они требуют значений в диапазоне unsigned char). С другой стороны, для всех функций ввода-вывода требуется char *, что требует приведения типов всякий раз, когда вы выполняете ввод-вывод.

Что касается UTF-8, хранить его в подписанных или неподписанных массивах - это нормально, но вы должны быть осторожны с этими строковыми литералами, поскольку нет никакой гарантии, что они действительны в UTF-8. C ++ 0x добавляет строковые литералы UTF-8, чтобы избежать возможных проблем, и я ожидаю, что следующий стандарт C также их примет.

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

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

Две вещи:

  1. Знаковый или неподписанный тип char не повлияет на вашу способность преобразовывать строки в кодировке UTF8 в любой тип отображаемой строки, который вы используете (WCHAR и т. Д.), И обратно. Другими словами, не беспокойтесь об этом: байты UTF8 - это просто байты, и все, что вы используете в качестве кодировщика / декодера, будет правильным.

  2. Некоторое замешательство может заключаться в том, что вы пытаетесь сделать это:

     unsigned char * string = "Это строка UTF8"; 
     

    Не делайте этого - вы Смешиваем разные концепции. Строка в кодировке UTF-8 - это просто последовательность байтов. Строковые литералы C (как указано выше) на самом деле не были предназначены для этого; они предназначены для представления строк в кодировке ASCII. Хотя в некоторых случаях (например, в моем здесь) они оказываются одним и тем же, в вашем примере в вопросе это может быть не так. И уж точно в других случаях их не будет. Загрузите строки Unicode из внешнего ресурса. В общем, я бы с осторожностью вставлял символы, отличные от ASCII, в исходный файл .c; даже если компилятор знает, что с ними делать, другое программное обеспечение в вашей инструментальной цепочке может не знать.

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

Не совсем, беззнаковый / подписанный не указывает, сколько значений может содержать переменная. Он определяет, как они интерпретируются .

Итак, символ без знака имеет такое же количество значений, что и знаковый символ , за исключением того, что один имеет отрицательные числа, а другой - нет. Это по-прежнему 8 бит (если предположить, что char содержит 8 бит, я не уверен, что так будет везде).

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

знаковый / беззнаковый влияет только на арифметические операции. если char беззнаковый, то более высокие значения будут положительными. в случае подписания они будут отрицательными. Но диапазон все тот же.

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

Нет никакой разницы при использовании символа * в качестве строки. Единственный раз, когда подписанный / неподписанный будет иметь значение, - это если бы вы интерпретировали его как число, например, для арифметики, или если бы вы должны были распечатать его как целое число.

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

У меня был пара просьб объяснить мой комментарий.

Тот факт, что тип char по умолчанию может быть либо знаковым, либо беззнаковым, может иметь значение, когда вы сравниваете символы и ожидаете определенного порядка. В частности, UTF8 использует старший бит (при условии, что char является 8-битным типом, что верно для подавляющего большинства платформ), чтобы указать, что кодовая точка символа требует представления более одного байта. .

Быстрый и грязный пример проблемы:

#include <stdio.h>
int main( void)
{
    signed char flag = 0xf0;
    unsigned char uflag = 0xf0;

    if (flag < (signed char) 'z') {
        printf( "flag is smaller than 'z'\n");
    }
    else {
        printf( "flag is larger than 'z'\n");
    }    


    if (uflag < (unsigned char) 'z') {
        printf( "uflag is smaller than 'z'\n");
    }
    else {
        printf( "uflag is larger than 'z'\n");
    }
    return 0;
}

В большинстве проектов, над которыми я работаю, обычно избегают неукрашенного типа char в пользу использования typedef, который явно указывает unsigned char. . Что-то вроде uint8_t из stdint.h или

typedef unsigned char u8;

Обычно работа с типом unsigned char работает хорошо и имеет несколько проблем - единственная область, в которой Я видел случайные проблемы при использовании чего-то подобного для управления циклом:

while (uchar_var-- >= 0) {
    // infinite loop...
}
6
ответ дан 3 December 2019 в 20:03
поделиться

Символы UTF-8 не могут храниться в одном байте. Символы UTF-8 могут иметь ширину 1–4 байта.Таким образом, char , wchar_t , подписанный или беззнаковый не будет достаточным, если предположить, что один блок всегда может хранить один символ UTF-8. .

На большинстве платформ (таких как PHP, .NET и т. Д.) Вы обычно строите строки (например, char [] в C), и вы используете библиотеку для преобразования между кодировками и синтаксического анализа символов из Струна.

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

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