fopen的文件名参数是否能够支持utf8编码?

rocktyt 2013-06-19 12:57:44
现在有个utf8编码的字符串的文件路径,有没有办法通过编码转换以及locale的设置使得最后以const char*的形式传给fopen函数并正确打开?
因为字符串里可能有当前代码页不支持的字符,所以不能直接转
改_wfopen的话代码改动范围太大,有没有什么好一点的方法
...全文
167 点赞 收藏 5
写回复
5 条回复
www_adintr_com 2013年07月03日
先把 utf8 转成 unicode, MultiByteToWideChar(CP_UTF8 ..... 然后再从 unicode 转换成 本地编码, 或你指定的某一种编码: WideCharToMultiByte(CP_ACP... 如果我要转换成泰文的: WideCharToMultiByte(874....
回复 点赞
rocktyt 2013年07月03日
于是散分吧。
回复 点赞
ma100 2013年06月19日
a.h, utf格式, 里面 定义 const char *path = "xxxxx"; a.cpp, 格式任意, fopen ( path, ... ) 即可
回复 点赞
rocktyt 2013年06月19日
引用 1 楼 turingo 的回复:
可以参考我以前的一段代码:

#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;
}
没有解决我问的问题 字符串里可能会有当前编码页不支持的字符(比如GB2312里无法显示的 ・ ) 字符串是文件路径,不是文件内容
回复 点赞
图灵狗 2013年06月19日
可以参考我以前的一段代码:

#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;
}
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告