因为字符串里可能有当前代码页不支持的字符,所以不能直接转
改_wfopen的话代码改动范围太大,有没有什么好一点的方法
5 个解决方案
#1
可以参考我以前的一段代码:
#include <stdlib.h>
#include <string.h>
#include <iconv.h>
#include <stdio.h>
#define hz_offset(hz) (((hz[0] - 0xa1) * 94 + (hz[1] - 0xa1)) * 32)
/* 字符串转码 */
int decoding(char* from_charset, char* to_charset, char* inbuf, int inlen, char* outbuf, int outlen)
{
iconv_t cd;
char** pin = &inbuf;
char** pout = &outbuf;
if((cd = iconv_open(to_charset, from_charset)) == (iconv_t)0)
{
return -1;
}
memset(outbuf, 0, outlen);
if(iconv(cd, pin, &inlen, pout, &outlen) == -1)
{
iconv_close(cd);
return -1;
}
iconv_close(cd);
return 0;
}
/* 汉字从UTF-8转为GB2312编码 */
int hz_decoding(char* hz_utf8, char* hz_gb2312)
{
return decoding("utf-8", "gb2312", hz_utf8, 3, hz_gb2312, 3);
}
/* 打印汉字 */
void hz_show(unsigned char* datas)
{
int i;
int j;
int k;
unsigned char ch;
for(i = 0; i < 16; i++)
{
for(j = 0; j < 2; j++)
{
ch = datas[i * 2 + j];
for(k = 0; k < 8; k++)
{
if(ch & 0x80)
{
printf("%c ", '*');
}
else
{
printf(" ");
}
ch <<= 1;
}
}
printf("\n");
}
}
int main(int argc, char* argv[])
{
FILE* hzk;
unsigned char hz_utf8[3] = "宋";
unsigned char hz_gb2312[3];
unsigned char hz_datas[32];
hz_decoding(hz_utf8, hz_gb2312);
printf("%x, %x\n", hz_gb2312[0], hz_gb2312[1]);
if((hzk = fopen("simhei_gb2312_16.ds", "rb")) == NULL)
{
return -1;
}
fseek(hzk, hz_offset(hz_gb2312), SEEK_SET);
fread(hz_datas, 32, 1, hzk);
hz_show(hz_datas);
fclose(hzk);
return 0;
}
#2
没有解决我问的问题
字符串里可能会有当前编码页不支持的字符(比如GB2312里无法显示的 ・ )
字符串是文件路径,不是文件内容
字符串里可能会有当前编码页不支持的字符(比如GB2312里无法显示的 ・ )
字符串是文件路径,不是文件内容
#3
a.h, utf格式, 里面 定义 const char *path = "xxxxx";
a.cpp, 格式任意, fopen ( path, ... ) 即可
a.cpp, 格式任意, fopen ( path, ... ) 即可
#4
于是散分吧。
#5
先把 utf8 转成 unicode,
MultiByteToWideChar(CP_UTF8 .....
然后再从 unicode 转换成 本地编码, 或你指定的某一种编码:
WideCharToMultiByte(CP_ACP...
如果我要转换成泰文的:
WideCharToMultiByte(874....
MultiByteToWideChar(CP_UTF8 .....
然后再从 unicode 转换成 本地编码, 或你指定的某一种编码:
WideCharToMultiByte(CP_ACP...
如果我要转换成泰文的:
WideCharToMultiByte(874....
#1
可以参考我以前的一段代码:
#include <stdlib.h>
#include <string.h>
#include <iconv.h>
#include <stdio.h>
#define hz_offset(hz) (((hz[0] - 0xa1) * 94 + (hz[1] - 0xa1)) * 32)
/* 字符串转码 */
int decoding(char* from_charset, char* to_charset, char* inbuf, int inlen, char* outbuf, int outlen)
{
iconv_t cd;
char** pin = &inbuf;
char** pout = &outbuf;
if((cd = iconv_open(to_charset, from_charset)) == (iconv_t)0)
{
return -1;
}
memset(outbuf, 0, outlen);
if(iconv(cd, pin, &inlen, pout, &outlen) == -1)
{
iconv_close(cd);
return -1;
}
iconv_close(cd);
return 0;
}
/* 汉字从UTF-8转为GB2312编码 */
int hz_decoding(char* hz_utf8, char* hz_gb2312)
{
return decoding("utf-8", "gb2312", hz_utf8, 3, hz_gb2312, 3);
}
/* 打印汉字 */
void hz_show(unsigned char* datas)
{
int i;
int j;
int k;
unsigned char ch;
for(i = 0; i < 16; i++)
{
for(j = 0; j < 2; j++)
{
ch = datas[i * 2 + j];
for(k = 0; k < 8; k++)
{
if(ch & 0x80)
{
printf("%c ", '*');
}
else
{
printf(" ");
}
ch <<= 1;
}
}
printf("\n");
}
}
int main(int argc, char* argv[])
{
FILE* hzk;
unsigned char hz_utf8[3] = "宋";
unsigned char hz_gb2312[3];
unsigned char hz_datas[32];
hz_decoding(hz_utf8, hz_gb2312);
printf("%x, %x\n", hz_gb2312[0], hz_gb2312[1]);
if((hzk = fopen("simhei_gb2312_16.ds", "rb")) == NULL)
{
return -1;
}
fseek(hzk, hz_offset(hz_gb2312), SEEK_SET);
fread(hz_datas, 32, 1, hzk);
hz_show(hz_datas);
fclose(hzk);
return 0;
}
#2
没有解决我问的问题
字符串里可能会有当前编码页不支持的字符(比如GB2312里无法显示的 ・ )
字符串是文件路径,不是文件内容
字符串里可能会有当前编码页不支持的字符(比如GB2312里无法显示的 ・ )
字符串是文件路径,不是文件内容
#3
a.h, utf格式, 里面 定义 const char *path = "xxxxx";
a.cpp, 格式任意, fopen ( path, ... ) 即可
a.cpp, 格式任意, fopen ( path, ... ) 即可
#4
于是散分吧。
#5
先把 utf8 转成 unicode,
MultiByteToWideChar(CP_UTF8 .....
然后再从 unicode 转换成 本地编码, 或你指定的某一种编码:
WideCharToMultiByte(CP_ACP...
如果我要转换成泰文的:
WideCharToMultiByte(874....
MultiByteToWideChar(CP_UTF8 .....
然后再从 unicode 转换成 本地编码, 或你指定的某一种编码:
WideCharToMultiByte(CP_ACP...
如果我要转换成泰文的:
WideCharToMultiByte(874....