可冰

冰,是沉睡着的水......

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  37 随笔 :: 5 文章 :: 94 评论 :: 0 Trackbacks
上周,我花了很多心思使用模板写了一个UTF-8与UNICODE相互转换的功能(见文件code.rar),刚开始感觉还可以,但这几天慢慢的觉得,为什么不直接提供两个函数呢,这样不是简单方便吗?我这样的设计又能带来额外的什么好处呢?刚开始我是想提供比较方便好用以及容易扩展与维护的代码,但现在感觉到与直接提供C式的函数并没有多少额外的好处.或许这样的简单功能根本就用不着这样复杂的代码吧.正如Eric Raymond对C++的评价一样,它"使程序员倾向于写复杂的代码".
我想大家看看我的代码,给我一点意见和建议.
posted on 2005-09-29 20:34 可冰 阅读(9306) 评论(10)  编辑 收藏 引用 所属分类: C++UTF-8

评论

# re: 评价一下UTF-8与UNICODE相互转换的代码 2005-09-29 21:27 cpunion
下载不了。

前几天看你写了个模板方式的,感觉是不必要,模板一般用在批量产生代码、加强类型检查、提高效率、普通代码不好解决问题的时候。  回复  更多评论
  

# re: 评价一下UTF-8与UNICODE相互转换的代码 2005-09-29 23:05 可冰
谢谢提醒.我已经将文件转放在博客园上,现在可以下载了.  回复  更多评论
  

# re: 评价一下UTF-8与UNICODE相互转换的代码 2005-09-29 23:18 cpunion
直接使用2个函数,unicodeToUtf8, utf8ToUnicode更简单。

从你的模板参数可以得知,2个int值的模板参数将推导出2个类型,最终还是被映射到2个不同的算法上了,不如简单地做:

string convert (const wstring& src);

wstring convert (const string& src);  回复  更多评论
  

# re: 评价一下UTF-8与UNICODE相互转换的代码 2005-09-29 23:30 可冰
嗯,确实是.
你说的是对的,模板不能滥用,"模板一般用在批量产生代码、加强类型检查、提高效率、普通代码不好解决问题的时候".以后我会记住的.
其实,我确实可能是有一点追求复杂代码的倾向,写代码时考虑代码最多,而不是具体的运用.在这一点上我是走错路了.
以后一定要改!  回复  更多评论
  

# re: 评价一下UTF-8与UNICODE相互转换的代码 2005-09-30 09:02 ilovevc
恕我直言, 你这个程序写得并不好, 一看就是看设计模式走火入魔的一种.
1. singleton根本就不需要, 而且在没有GC的C++中还带来了释放的问题. 你就提供几个static 成员函数就可以了.
2. 过多的类层次,什么ConcreteConvert, 虚函数根本没有必要, 实际上最后就是两个类, 每个类有一个static member function进行转换就可以了.
3. 使用模板可以, 但是你这个模板没有太多意思. 可以考虑使用iterator的concept, 例如 convert(In src_first, In src_last, Out out_first), 这样可以很灵活, 例如使用一个string的back_inserter作为Out参数就可以自动分配内存.
4. 界面不直观. 看你的cpp文件就知道. 我认为的界面可能有一下形式:
uncode_convert<utf-8, unicode>(......);
unicode_convert<unicode, utf-8>(....);

总之, 本质原因我认为并不是你过于**追究**复杂代码, 而是你解决问题的时候使用了复杂的方式.   回复  更多评论
  

# re: 评价一下UTF-8与UNICODE相互转换的代码 2005-09-30 13:13 可冰
谢谢你的批评.我也正是认识到这个问题后来向大家寻求帮助的.
另外你给我建议很不错的,可以考虑那样的实现.  回复  更多评论
  

# re: 评价一下UTF-8与UNICODE相互转换的代码 2006-02-15 03:33 Edward
请教:
I build a function:

wstring mbstowcs(const string &str) {
size_t len=mbstowcs(NULL, str.c_str(), str.length());
wchar_t *pwc = (wchar_t *)malloc( len* sizeof( wchar_t ));
len=mbstowcs(pwc, str.c_str(), str.length());
return wstring(pwc,len);
}

"str" is a chinese string. but after convertion, "pwc" is a string that I couldn't read. 乱码。Why? 我的计算机是英文windwos,但可以输入和显示汉字。

Edward  回复  更多评论
  

# re: 评价一下UTF-8与UNICODE相互转换的代码 2006-02-15 17:19 张沈鹏
http://www.cppblog.com/zuroc/archive/2006/02/15/3269.html  回复  更多评论
  

# re: 评价一下UTF-8与UNICODE相互转换的代码 2009-04-17 10:42 创意产品网
不错  回复  更多评论
  

# re: 评价一下UTF-8与UNICODE相互转换的代码 2009-06-08 16:21 george.qiao
int32 UnicodeToUTF8(const oscl_wchar *szSrc, int32 nSrcLen, char *strDest, int32 nDestLen)
{
int32 i = 0;
int32 i_cur_output = 0;
char ch_tmp_byte;

if (nDestLen <= 0)
{
// We cannot append terminate string for this case.
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}

for (i = 0; i < nSrcLen; i++)
{
if (BYTE_1_REP > szSrc[i]) /* 1 byte utf8 representation */
{
if (i_cur_output + 1 < nDestLen)
{
strDest[i_cur_output++] = (char)szSrc[i];
}
else
{
strDest[i_cur_output] = '\0'; /* Terminate string */
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else if (BYTE_2_REP > szSrc[i]) /* 2 byte utf8 representation */
{
if (i_cur_output + 2 < nDestLen)
{
strDest[i_cur_output++] = (char)(szSrc[i] >> 6 | 0xc0);
strDest[i_cur_output++] = (char)((szSrc[i] & 0x3f) | 0x80);
}
else
{
strDest[i_cur_output] = '\0'; /* Terminate string */
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else if (SURROGATE_MAX > szSrc[i] && SURROGATE_MIN < szSrc[i])
{ /* 4 byte surrogate pair representation */
if (i_cur_output + 4 < nDestLen)
{
ch_tmp_byte = (char)(((szSrc[i] & 0x3c0) >> 6) + 1);
strDest[i_cur_output++] = (char)(ch_tmp_byte >> 2 | 0xf0);
strDest[i_cur_output++] = (char)(((ch_tmp_byte & 0x03) | 0x80) | (szSrc[i] & 0x3e) >> 2);
}
else
{
strDest[i_cur_output] = '\0'; /* Terminate string */
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else /* 3 byte utf8 representation */
{
if (i_cur_output + 3 < nDestLen)
{
strDest[i_cur_output++] = (char)(szSrc[i] >> 12 | 0xe0);
strDest[i_cur_output++] = (char)(((szSrc[i] >> 6) & 0x3f) | 0x80);
strDest[i_cur_output++] = (char)((szSrc[i] & 0x3f) | 0x80);
}
else
{
strDest[i_cur_output] = '\0'; /* Terminate string */
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
} /* @todo Handle surrogate pairs */
}

strDest[i_cur_output] = '\0'; /* Terminate string */
return i_cur_output; /* This value is in bytes */  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理