漢字編碼問題(OJ 2h奮戰血淚)

永遠想不到漢字的utf-8 gcc 編碼其實是三個字符,我是在云IDE發現的.....
#include<bits/stdc++.h>
using namespace std;
//A>K>Q>J>>10>9>...>3>2
struct Card{
char name[10];
int color;
int number;
void change(){
if( strstr(name,"大王") ){
color=11;
}else if( strstr(name,"小王") ){
color=10;
}else if( strstr(name,"黑桃") ){
color=4;
}else if( strstr(name,"紅桃") ){
color=3;
}else if( strstr(name,"梅花") ){
color=2;
}else if( strstr(name,"方塊") ){
color=1;
}
// printf("%s",name);
// printf("::%d\n",strlen(name) );
// for(int i=0;i<strlen(name);i++){
// printf("%d ",name[i]);
// }
// puts("");
switch (name[6]){
case 'A':{
number=23;
break;
}
case 'K':{
number=22;
break;
}
case 'Q':{
number=21;
break;
}
case 'J':{
number=20;
break;
}
default:{
if(name[7]=='0')
number=10;
else
number=name[6]-'0';
break;
}
}
}
bool operator<(const Card&x)const{
if(color!=x.color)
return color>x.color;
else
return number>x.number;
}
}var[1000];
signed main(void)
{
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",var[i].name);
var[i].change();
}
sort(var+1,var+1+n);
for(int i=1;i<=n;i++){
printf(" %s"+(i==1),var[i].name);
}
printf("\n");
}
return 0;
}
漢字編碼問題
編碼就是把什么東西當作什么的問題,計算機善于處理數字,任何自然狀態下不能表示為數字的東西,都是難以直接處理的;若我們可以把那些東西都用數字表示出來,那就可以被計算機處理,享受計算機的帶來的便利;
字符串在計算機內部主要是以末尾有\0的char數組形式儲存;這個東西發源西方,對于中文,處理char的編譯器(gcc,clang)就不認識了,本質上是編譯器采取的utf-8編碼和GBK編碼(策略)不能把漢字處理成一個字面量;所以出現了unicode編碼去用一個'字符'(多個字節)去代表中文;
C語言內部的Unicode就是wchar_t;
在實驗的過程中可以發現漢字輸入進去之后是不止一個字符的,但也不一定是兩個字符,而且其char保存的數值還是負數,大概是當初ASCII碼編寫的是時候沒有留位置或者是需要當作unsigned char去處理;
| 數據類型 | 編碼 | size_t | |
| clang | gcc | ||
| char | GBK | 8 兩個 | 8 兩個 |
| char | utf-8 | (BOM)8兩個/12三個個 | 12三個 |
| wchar_t | Unicode | 一個 | 一個 |
Unicode
Unicode編碼不是char類型自然擁有的編碼,他需要用新的數據類型,在C語言內部就是wchar_t,那么也有相應的處理這個的函數,egwprintf() , wscanf
轉換成Unicode:
clang: utf-8(有bom) -> gbk -> Unicode
gcc: utf-8(默認)->Unicode
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main()
{
wchar_t a [] = L"ABCD";
wchar_t b [] = L"\x41\x42\x43\x44";
setlocale(LC_ALL, "");
wprintf(L"a:%ls b:%ls", a, b);
return 0;
}
printf()是根據格式控制符來解釋內存中的內容的,所以,當我們用 char* 和 wchar_t * 時,格式控制就很重要了,不然一個 wchar_t* 直接作為 char * 來解釋或翻過來解釋,結果你可以想得到的,對吧;
浙公網安備 33010602011771號