我的母語不是英語,是葡萄牙語-BR,我們有這些重音字符(á、à、?、? 等)。
所以,我的問題是,如果我將這些字符中的一個放入字串中,并嘗試遍歷其中的每個字符,我將得到兩個字符是在螢屏上顯示“?”所必需的。
這是關于我迭代字串“(N?o Informado)”的影像,意思是:Uninformed。如果我們逐個計算每個字符,字串的長度應該為 15。但是如果我們呼叫strlen("(N?o Informado)");
,結果是 16。
我用來列印此影像中每個字符的代碼是這樣的:
void print_buffer (const char * buffer) {
int size = strlen(buffer);
printf("BUFFER: %s / %i\n", buffer, size);
for (int i = 0; buffer[i] != '\0'; i) {
printf("[%i]: %i\n", i, (unsigned char) buffer[i]);
}
}
因此,在圖形應用程式中,緩沖區可以顯示“?bc”,而在原始字串中,我們不會有 3 個字符,而實際上是 4 個。
所以這是我的問題,有沒有辦法知道字串中的哪些字符是這些特殊字符的組合?是否有規則來設計和限制這種情況的發生?它總是由 2 個字符組成嗎?例如,一個特殊字符可以由 3 或 4 組成嗎?
謝謝
uj5u.com熱心網友回復:
有沒有辦法知道字串中的哪些字符是這些特殊字符的組合?
是的,要檢查某個位元組是否是多位元組字符的一部分,您只需要按位運算 ( c & 0x80
),例如:
#include <stdio.h>
int is_multibyte(int c)
{
return c & 0x80;
}
int main(void)
{
const char *str = "?bc";
while (*str != 0)
{
printf(
"%c %s part of a multibyte\n",
*str, is_multibyte(*str) ? "is" : "is not"
);
str ;
}
return 0;
}
輸出:
? is part of a multibyte
? is part of a multibyte
b is not part of a multibyte
c is not part of a multibyte
如果我們逐個計算每個字符,字串的長度應該為 15。但是如果我們呼叫 strlen("(N?o Informado)");,結果是 16。
似乎您對代碼點數而不是位元組數感興趣,不是嗎?
在這種情況下,您要使用以下內容進行屏蔽(c & 0xc0) != 0x80
:
#include <stdio.h>
size_t mylength(const char *str)
{
size_t len = 0;
while (*str != 0)
{
if ((*str & 0xc0) != 0x80)
{
len ;
}
str ;
}
return len;
}
int main(void)
{
const char *str = "?bc";
printf("Length of \"%s\" = %zu\n", str, mylength(str));
return 0;
}
輸出:
Length of "?bc" = 3
Could a special character be composed of 3 or 4, for example?
是的,當然,歐元符號€
就是一個例子(3 個位元組),來自這個不錯的答案:
- 任何高達 U 007F 的東西都需要 1 個位元組:基本拉丁語
- 然后到 U 07FF 需要 2 個位元組:希臘語、阿拉伯語、西里爾語、希伯來語等
- 然后到 U FFFF 需要 3 個位元組:中文、日文、韓文、梵文等
- 除此之外它需要4個位元組
是否有規則來設計和限制這種情況的發生?
如果您的意思是能夠以相同的寬度處理所有字符,C 有專門的寬字符庫:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
setlocale(LC_CTYPE, "");
wchar_t *str = L"?bc";
while (*str != 0)
{
printf("%lc\n", *str);
str ;
}
return 0;
}
輸出:
?
b
c
要獲得可以使用的長度wcslen
:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
setlocale(LC_CTYPE, "");
wchar_t *str = L"?bc";
printf("Length of \"%ls\" = %zu\n", str, wcslen(str));
return 0;
}
輸出:
Length of "?bc" = 3
但是,如果“限制”的意思是“避免”那些多位元組字符,則可以從 UTF8 音譯為純 ASCII。如果 posix 是一個選項,請查看iconv,您在這里有一個示例
El ca?ón de María vale 1000 €
轉換為
El canon de Maria vale 1000 EUR
在你的情況下
N?o Informado
轉換為
Nao Informado
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/377114.html