ArvindSai Ответов: 3

Как напечатать символ тета на языке Си


Как напечатать символ тета на языке Си

Что я уже пробовал:

Ничего...понятия не имею..................

3 Ответов

Рейтинг:
9

RAMASWAMY EKAMBARAM

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

#include <stdio.h>

#define MAX_PRINT 		25

int codepoint2utf8(unsigned char *utf8, unsigned int codepoint);
int getbytecount(unsigned int codepoint);

unsigned int alpha = 0x3b1; // UNICODE value for ALPHA
unsigned char utf8str[10];

unsigned char utf8_flag_bytes[] = {	0xef, 0xbb, 0xbf };  // these leading values at start of file (.txt) denote UTF-8 encoding

char *filename = "greek.txt";
void main()
{
	FILE *fp;
	int codelen;
	int i;
	
	fp = fopen(filename, "wb");
	fwrite(utf8_flag_bytes, 1, 3, fp);  // first write the UTF-8 signature to the start of file
	
	for(i = 0; i < MAX_PRINT; i++)
	{
		codelen = codepoint2utf8(utf8str, alpha + i);
		codelen += codepoint2utf8(utf8str + codelen, ' ');

		fwrite(utf8str, 1, codelen, fp);
	}
	
	fclose(fp);
}

int codepoint2utf8(unsigned char *utf8, unsigned int codepoint)
{
	unsigned char byteval, mask, leadbyte = 0, countbit = 0;
	int numbytes, i;
	
	mask = 0x3f;   // mask for continuation byes ie for extracting least significant 6 bits
	
	numbytes = getbytecount(codepoint);
	if(numbytes > 1)
		countbit = (1 << 7);
	for(i = numbytes - 1; i > 0; i--, countbit >>= 1)
	{
		byteval = (codepoint & mask) | (1 << 7);
		leadbyte |= countbit;  // set next significant bit for each byte added
		codepoint >>= 6;      // next 6 bits
		utf8[i] = byteval;
	}
	leadbyte |= (countbit | codepoint);
	utf8[i] = leadbyte;
	
	return numbytes;
}

int getbytecount(unsigned int codepoint)
{
	unsigned int i, bits, continuations = 0, leadbits = 5;
	
	for(i = 31, bits = 0; i > 0 && bits == 0; i--)
	{
		if((1 << i) & codepoint)
			bits = i + 1;
	}
	
	if(bits <= 7)
		goto exitpoint;
	
	continuations = 1;  // min value
	while(bits > leadbits + continuations * 6)  // 'leadbits' is no of bits avail for coding in lead byte 
	{                                           // every continuation byte is of the form 10xxxxxx where 'xxxxxx' represents part codepoint value
		leadbits--;
		continuations++;
	}
	
exitpoint:
	return (1 + continuations);  // no of bytes reqd is 1(for lead byte) + no of continuation bytes
}

/*
-- link http://stackoverflow.com/questions/4607413/c-library-to-convert-unicode-code-points-to-utf8
if (c<0x80) *b++=c;
else if (c<0x800) *b++=192+c/64, *b++=128+c%64;
else if (c-0xd800u<0x800) goto error;
else if (c<0x10000) *b++=224+c/4096, *b++=128+c/64%64, *b++=128+c%64;
else if (c<0x110000) *b++=240+c/262144, *b++=128+c/4096%64, *b++=128+c/64%64, *b++=128+c%64;
else goto error;
*/


0x01AA

Похоже, он не ОП ;)

Graeme_Grant

вупси ... похоже на него ... надо проверить в будущем...

Рейтинг:
25

OriginalGriff

Попробуй:

#include <stdio.h>

int main()
{
    printf("Theta: Θ\n");

    return 0;
}


ArvindSai

Я не нахожу на своей клавиатуре ни одной клавиши, которая печатала бы символ тета, кроме того, я обнаружил, что ASCII 233 будет содержать символ тета, как вы ввели его через клавиатуру.

OriginalGriff

Зависит от обстоятельств-самый простой способ-просто скопировать и вставить символ. Вот что я сделал!

Имейте в виду, что Windows не использует ASCII - она использует Unicode, который является 16-битной "супер-версией" ASCII (которая технически является 7-битной, но имеет расширенную версию, которая является 8-битной и включает тета). Таким образом, вы хотите, чтобы тета Юникода была \u03f4 и могла (или не могла) быть введена как строковый символ в вашем C - в зависимости от того, что такое компилятор.
Понимаете, что я имею в виду, что копировать и вставлять проще? :смеяться:

ArvindSai

Ну спасибо, но на клавиатуре моего ноутбука нет цифровой клавиатуры, только цифровые клавиши над алфавитами, я пытался использовать их, но это не сработало, как я могу сделать это без использования цифровой клавиатуры

ArvindSai

Это должно сработать: смейтесь:

Рейтинг:
14

Graeme_Grant

У богов Google есть ответ, который вы ищете...

Используемый поиск: тета символ шестнадцатеричное значение[^]

Ответ найден: Символ Юникода "греческая маленькая буква тета" (U+03B8)[^]


0x01AA

5 за такой полный ответ.
Я имею в виду показать, как Google _including_ соответствующие ключевые слова и последнее, но не менее важное, дать подсказку, какой ответ может помочь.
*смеяться*

Graeme_Grant

:) Они-боги ... так легко найти то, что вы ищете... даже мои 75-летние родители находят это легко... и у них есть Логизомеханофобия[^] ;)