Я считал, что C не определяют, если символ подписывается или не подписан, и на странице GCC это говорит, что может быть подписано на x86 и неподписанное в PowerPPC и ARM.
Okey, я пишу программу с БОЙКИМИ, которые определяют символ как gchar (не больше, чем он, только путь к стандартизации).
Мой вопрос, что относительно UTF-8? Это использует больше, чем блок памяти?
Скажите, что у меня есть переменная
неподписанный символ *представляет в виде строки = "Моя строка с UTF8 enconding ~> çã";
Посмотрите, если я объявляю свою переменную как
неподписанный
У меня будет только 127 значений (так мое желание программы сохранить больше блоков мадам), или UTF-8 изменяются на отрицание также?
Извините, если я не могу объяснить это правильно, но я думаю, что я немного сложен.
Примечание: Спасибо за весь ответ
Я не понимаю, как это обычно интерпретируется.
Я думаю, что как ASCII, если у меня есть и неподписанный символ со знаком на моей программе, строки имеют по-другому значения, и это ведет, чтобы перепутать, вообразить это в utf8 так.
Использование беззнаковых символов имеет свои плюсы и минусы. Самым большим преимуществом является то, что вы не получаете расширение знака или другие забавные функции, такие как подписанное переполнение, которое привело бы к неожиданным результатам расчетов. Unsigned char также совместим с макросами / функциями
Что касается UTF-8, хранить его в подписанных или неподписанных массивах - это нормально, но вы должны быть осторожны с этими строковыми литералами, поскольку нет никакой гарантии, что они действительны в UTF-8. C ++ 0x добавляет строковые литералы UTF-8, чтобы избежать возможных проблем, и я ожидаю, что следующий стандарт C также их примет.
В целом все должно быть в порядке, если вы убедитесь, что файлы исходного кода всегда имеют кодировку UTF-8.
Две вещи:
Знаковый или неподписанный тип char не повлияет на вашу способность преобразовывать строки в кодировке UTF8 в любой тип отображаемой строки, который вы используете (WCHAR и т. Д.), И обратно. Другими словами, не беспокойтесь об этом: байты UTF8 - это просто байты, и все, что вы используете в качестве кодировщика / декодера, будет правильным.
Некоторое замешательство может заключаться в том, что вы пытаетесь сделать это:
unsigned char * string = "Это строка UTF8";
Не делайте этого - вы Смешиваем разные концепции. Строка в кодировке UTF-8 - это просто последовательность байтов. Строковые литералы C (как указано выше) на самом деле не были предназначены для этого; они предназначены для представления строк в кодировке ASCII. Хотя в некоторых случаях (например, в моем здесь) они оказываются одним и тем же, в вашем примере в вопросе это может быть не так. И уж точно в других случаях их не будет. Загрузите строки Unicode из внешнего ресурса. В общем, я бы с осторожностью вставлял символы, отличные от ASCII, в исходный файл .c; даже если компилятор знает, что с ними делать, другое программное обеспечение в вашей инструментальной цепочке может не знать.
Не совсем, беззнаковый
/ подписанный
не указывает, сколько значений может содержать переменная. Он определяет, как они интерпретируются .
Итак, символ без знака
имеет такое же количество значений, что и знаковый символ
, за исключением того, что один имеет отрицательные числа, а другой - нет. Это по-прежнему 8 бит (если предположить, что char
содержит 8 бит, я не уверен, что так будет везде).
знаковый / беззнаковый влияет только на арифметические операции. если char беззнаковый, то более высокие значения будут положительными. в случае подписания они будут отрицательными. Но диапазон все тот же.
Нет никакой разницы при использовании символа * в качестве строки. Единственный раз, когда подписанный / неподписанный будет иметь значение, - это если бы вы интерпретировали его как число, например, для арифметики, или если бы вы должны были распечатать его как целое число.
У меня был пара просьб объяснить мой комментарий.
Тот факт, что тип 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...
}
Символы UTF-8 не могут храниться в одном байте. Символы UTF-8 могут иметь ширину 1–4 байта.Таким образом, char
, wchar_t
, подписанный
или беззнаковый
не будет достаточным, если предположить, что один блок всегда может хранить один символ UTF-8. .
На большинстве платформ (таких как PHP, .NET и т. Д.) Вы обычно строите строки (например, char []
в C), и вы используете библиотеку для преобразования между кодировками и синтаксического анализа символов из Струна.