前言
帮同事做了一个小实验, 在xshell上显示中文, 并将gbk内容从文件中读出来转成uft8
记录
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <iconv.h>
#define CSET_GBK "GBK"
#define CSET_UTF8 "UTF-8"
#define LC_NAME_zh_CN "zh_CN"
#define LC_NAME_zh_CN_GB2312 LC_NAME_zh_CN ""
#define LC_NAME_zh_CN_GBK LC_NAME_zh_CN "." CSET_GBK
#define LC_NAME_zh_CN_UTF8 LC_NAME_zh_CN "." CSET_UTF8
#define LC_NAME_zh_CN_DEFAULT LC_NAME_zh_CN_GB2312
int testcase_read_and_show_file();
int u2g(
char* inbuf, size_t inlen,
char* outbuf, size_t outlen);
int g2u(
char* inbuf, size_t inlen,
char* outbuf, size_t outlen);
int code_convert(
const char* from_charset,
const char* to_charset,
char* inbuf, size_t inlen,
char* outbuf, size_t outlen);
int main(
int argc,
char* argv[])
{
char* pcLocale = NULL;
pcLocale = setlocale(LC_ALL, LC_NAME_zh_CN_DEFAULT);
if (NULL != pcLocale) {
printf(
"\n%s\n", pcLocale);
}
printf(
"中文测试1\n");
printf(
"============================================================\n");
printf(
">> testcase build time 2017-4-13 14:33\n");
printf(
"============================================================\n");
testcase_read_and_show_file();
if (NULL != pcLocale) {
pcLocale = setlocale(LC_ALL, pcLocale);
printf(
"\n%s\n", pcLocale);
}
printf(
"============================================================\n");
printf(
"END, press any key to quit\n");
printf(
"============================================================\n");
getchar();
return 0;
}
int testcase_read_and_show_file()
{
FILE* fp;
const char* pCfgFileName =
"./file_for_test";
int i;
char szBuf[
1024] = {
'\0'};
char szBufUtf8[
1024] = {
'\0'};
printf(
"============================================================\n");
printf(
"const char* on project : %s\n",
"中文测试2.1");
printf(
"============================================================\n");
fp = fopen(pCfgFileName,
"r");
printf(
"%s %s\n", (NULL != fp) ?
"find" :
"not find", pCfgFileName);
if (fp != NULL) {
if (NULL != fp) {
printf(
"============================================================\n");
printf(
"const char* from file : \n");
printf(
"============================================================\n");
while (NULL != fgets(szBuf,
sizeof(szBuf), fp)) {
printf(
"print org : %s\n", szBuf);
g2u(szBuf,
strlen(szBuf), szBufUtf8,
sizeof(szBufUtf8));
printf(
"print utf8 : %s\n\n", szBufUtf8);
}
}
fclose(fp);
}
return 0;
}
int code_convert(
const char* from_charset,
const char* to_charset,
char* inbuf, size_t inlen,
char* outbuf, size_t outlen)
{
iconv_t cd;
int rc;
char** pin = &inbuf;
char** pout = &outbuf;
cd = iconv_open(to_charset, from_charset);
if (cd ==
0) {
return -
1;
}
memset(outbuf,
0, outlen);
if (iconv(cd, pin, &inlen, pout, &outlen) == -
1) {
return -
1;
}
iconv_close(cd);
return 0;
}
int u2g(
char* inbuf, size_t inlen,
char* outbuf, size_t outlen)
{
return code_convert(
"utf-8",
"gb2312", inbuf, inlen, outbuf, outlen);
}
int g2u(
char* inbuf, size_t inlen,
char* outbuf, size_t outlen)
{
return code_convert(
"gb2312",
"utf-8", inbuf, inlen, outbuf, outlen);
}
# testcase by lostspeed
# if makefile edit on windows, use astyle format it to move \r\n to \n
# first build do : chmod 777 *
# build cmd is : ./Makefile
clear
rm ./testcase
rm .
转载请注明原文地址: https://ju.6miu.com/read-671111.html