導航:首頁 > 操作系統 > linuxc漢字

linuxc漢字

發布時間:2024-12-22 05:03:14

Ⅰ 請求在linux下C語言如何將漢字轉換成UTF

試試這個四個函數,C 裡面的,Linux 可用:
mbtowc
wctomb
mbstowcs
wcstombs
在 Linux 下試試看吧:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main(void)
{
size_t cch;
char psz[1024];
wchar_t pwsz[] = { 0x52B3, 0x788C, 0x788C, 0 };
setlocale(LC_ALL, "");
cch = wcstombs(psz, pwsz, 1024);
if (cch != 0 && cch != -1) {
printf("%s", psz);
}
return 0;
}
zdl_361 說的 "utf8 勞碌碌" 不對,因為我也輸出 "勞碌碌",而我是用 Unicode 編碼的。在 Windows 上,char 是 ANSI,Unicode (wchar_t) 是 UTF-16;在 Linux 上,char 是 UTF-8,Unicode (wchar_t) 是 UTF-32。不過對於這個函數來說,在哪個平台上都不會因為字元編碼而影響使用。

Ⅱ Linux中c語言中漢字字元串的輸出

程序功能:查詢IP
使用方法:
將IP庫保存為c:\data.txt,將要查詢的IP保存為c:\ip.txt;編譯好本程序後,運行後產生c:\result.txt結果文件

程序BUG:data文件最後需要以兩個換行結束

*/

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>

#define TOTAL_INFO 100

extern void str_init(char* str1, char* str2, char* str3, char* str4); //字元串初始化函數
extern void str_init_total_info(char *str);
extern int read_file(FILE *fp, char *str); //讀取IP
extern void read_dt2_next(FILE *fp, char *str); //單獨保存資料庫中第二IP段,最大IP范圍
extern void next_line_data(FILE *fp); //專用:跳到下一行
extern void next_line_ip(FILE *fp);
extern int total_line(FILE *fp); //檢測文件總行數

int main(int argc, char *argv[])
{

FILE *fp_data, *fp_ip, *fp_result;

char t_dt1[5], t_dt2[5], t_dt3[5], t_dt4[5];
char t_ip1[5], t_ip2[5], t_ip3[5], t_ip4[5]; //4個IP段,便於比較和保存
char t_dt2_next[5]; //保存資料庫中同一行第二IP段,最大IP范圍
char addr_ip[50]; //輸出處理後的IP歸屬地
char temp;
char ip_total_info[30];

int flag_loop_ip=1, flag_loop_data=1;
int i=0, j=0, k=0, flag_complete=0;
int len_dt1, len_dt2;
int len_ip1, len_ip2;
int total_line_nu=0;

str_init(t_dt1, t_dt2, t_dt3, t_dt4); //初始化:將字元串以'\0'填充
str_init(t_ip1, t_ip2, t_ip3, t_ip4);
str_init_total_info(ip_total_info);

fp_data=fopen("c:\\data.txt", "r");
fp_ip=fopen("c:\\ip.txt", "r");
fp_result=fopen("c:\\result.txt", "a+"); //追加文件,若存在

total_line_nu=total_line(fp_ip); //獲取ip.txt文件的總行數

fseek(fp_ip, 0, SEEK_SET); //將fp_ip移動到文件開頭

for(i=0; i<total_line_nu; i++) //外層總循環,由ip.txt文件的總行數控制
{

flag_complete=0;

len_ip1=read_file(fp_ip, t_ip1);
len_ip2=read_file(fp_ip, t_ip2);
read_file(fp_ip, t_ip3);
read_file(fp_ip, t_ip4);

for(j=0; flag_complete == 0; j++) //內層總循環,控制條件:是否完成一次比較
{
len_dt1=read_file(fp_data, t_dt1); //讀取各段IP,並保存各段IP長度
len_dt2=read_file(fp_data, t_dt2);
read_file(fp_data, t_dt3);
read_file(fp_data, t_dt4);

read_dt2_next(fp_data, t_dt2_next); //單獨保存資料庫中第二IP段,最大IP范圍

fseek(fp_data,9,SEEK_CUR); //文件指針後移9位,指向漢字將要出現的地方

fgets(addr_ip, 20 , fp_data); //單獨保存IP信息(漢字)

for(k=0; (temp=fgetc(fp_data)) != '\n'; k++) //此處為了使主程序的內層循環自動換行
{

}

// fseek(fp_data,2,SEEK_CUR); //使fp_data指向下一行

// next_line(fp_data);

if(len_dt1==len_ip1 && len_dt2==len_ip2) //如果各段IP都一樣長,則比較
{
if( !strcmp(t_dt1, t_ip1) ) //如果第一段的IP內容一樣,比較第二段
{
if( ((strcmp(t_dt2, t_ip2)) <= 0) && ((strcmp(t_dt2_next, t_ip2)) >= 0) )
{ //如果要查詢IP在這個IP段(BUG為:最小范圍和最大范圍個數不一樣)

flag_complete = 1; //完成一次循環

strcpy(ip_total_info,t_ip1); //整理要輸出的信息
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip2);
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip3);
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip4);
strcat(ip_total_info,"\t");
strcat(ip_total_info,addr_ip);

fputs(ip_total_info, fp_result);

fseek(fp_data, 0, SEEK_SET); //將fp_data移動到文件開頭

}
}

}

//不滿足條件時返回循環,因為readfile函數的設置,不用再重置到下一行

}

}

// printf("ftell:%d\n",ftell(fp_data)); //獲取文件流的讀取位置

// fseek(fp,2,SEEK_CUR); //

fclose(fp_data);
fclose(fp_ip);
fclose(fp_result);
return 0;
}

void str_init(char *str1, char *str2, char *str3, char *str4)
{
int i;
for(i=0; i<5; i++)
{
str1[i]='\0';
str2[i]='\0';
str3[i]='\0';
str4[i]='\0';
}
}

///////////////////////////////////////////////////////////////////////////////////////////////////
int read_file(FILE *fp, char* str)
{
int i, len;
char t;

for(i=0; ( (str[i]=fgetc(fp)) >= '0') && (str[i] <= '9'); i++) //從文件中讀取字元串,直到非數字結束
{
}

str[i] = '\0'; //將最後讀取的非數字填充掉

len=strlen(str);
return len;

}

void read_dt2_next(FILE *fp, char *str) //單獨保存資料庫中第二IP段,最大IP范圍
{
char temp;
int flag=0,i;

for (i=0; flag != 1; i++ ) //直到找到第二段最大范圍IP
{
temp = fgetc(fp);
if(temp == '.') //第二段IP以第一段的.開始
{
flag = 1;
}
}

//保存找到的第二段最大范圍IP
for(i=0; ( (str[i]=fgetc(fp)) >= '0') && (str[i] <= '9'); i++) //從文件中讀取字元串,直到非數字結束
{
}

str[i] = '\0'; //將最後讀取的非數字填充掉

}

void next_line_data(FILE *fp) //使文件指針指向下一行
{
char t;
t=fgetc(fp);
while(t != '\n')
{
// printf("temp t:%c\n", t);
// system("pause");

t=fgetc(fp);
}

t=fgetc(fp);
if (t != '\n')
{
fseek(fp,-1,SEEK_CUR);
}
else
{
t=getc(fp);
if (t != '\n')
{
fseek(fp,-1,SEEK_CUR);
}
}
//fseek(fp,4,SEEK_CUR); //精確定位到下下一行,因為兩行之間有一個空白行
//t=fgetc(fp); //讀取換行符,使文件指針指向下一行

}

void next_line_ip(FILE *fp) //使文件指針指向下一行
{
char t;
t=fgetc(fp);
while(t != '\n')
{
// printf("temp t:%c\n", t);
// system("pause");

t=fgetc(fp);
}
fseek(fp,2,SEEK_CUR); //精確定位到下下一行,因為兩行之間有一個空白行
//t=fgetc(fp); //讀取換行符,使文件指針指向下一行

}

int total_line(FILE *fp) //檢測總行數
{
char t1, t2;
int flag=0, flag2=0;
t1 = fgetc(fp);
t2 = fgetc(fp);
while (t1 != EOF) //到達文件尾或出錯返回EOF
{
if( (t1 == '\n') && (t1=fgetc(fp) != EOF))
{
flag2=0;
flag+=1;
}
else flag2=1;

t1 = fgetc(fp);

}
flag=flag+flag2;
return flag;

}

void str_init_total_info(char *str)
{
int i;
for(i=0; i<TOTAL_INFO; i++)
{
str[i]='\0';
}
}
另外,團IDC網上有許多產品團購,便宜有口碑

閱讀全文

與linuxc漢字相關的資料

熱點內容
人成pDF 瀏覽:704
抽煙喝酒真的解壓嗎 瀏覽:562
精通php5應用開發 瀏覽:601
安卓機導資料到電腦用什麼軟體 瀏覽:813
變頻冰箱壓縮機一直工作 瀏覽:469
php編譯後怎麼加密 瀏覽:426
python程序代碼最簡單 瀏覽:129
文件夾粘貼文件黑屏一下 瀏覽:861
伺服器wait什麼意思 瀏覽:265
java電子商務系統源碼 瀏覽:502
單片機還要漲多久 瀏覽:260
蘋果app上的小鎖怎麼設置 瀏覽:538
瑞薩單片機為什麼不出名 瀏覽:801
阿里雲伺服器性能優化安全測試 瀏覽:372
linux組命令 瀏覽:967
怎麼推廣app讓人去下載和注冊 瀏覽:548
空調壓縮機啟動電容用大一點的行嗎 瀏覽:396
mac命令行查找文件 瀏覽:177
按鍵精靈安卓版怎麼停止線程 瀏覽:73
九爺妾不從命壓縮包下載 瀏覽:462