有没有简便的将多字节代码变为unicode代码的方法

clever101
领域专家: C/C++技术领域
2009-06-04 01:51:46
最近将一个多字节字符集代码改造为unicode字符集代码。但有一个问题比较烦人。就是常量字符串的改动。比如
TCHAR szName[] = "Jim", 需要改为
TCHAR szName[] = _T("Jim");

由于代码中常量字符串中较多,需要改动的地方不少。怎么改动呢?我想需不需要在“快速替换”对话框中使用什么正则表达式呢。我对正则表达式也不熟啊。

编译器是: VS 2005+ sp1.
...全文
271 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuweiping2003 2009-06-05
  • 打赏
  • 举报
回复
支持这个帖子 3楼很强大
纠结的程序猿 2009-06-05
  • 打赏
  • 举报
回复
下载PilotEdit 2.5, http://topic.csdn.net/u/20090512/21/99628cbd-3c70-4d29-91ff-1962f01e7a7c.html

用下面的正则表达式查找替换:
查找:^[\t ]*(TCHAR|char)?*=[\t ]*"*"[\t ]*;[\t ]*$
替换为:%01TCHAR%03%04%05_T(%06%07%08)%09%10%11


假设原始文件为:
#include "test.h"
TCHAR szName[] = "Jim";
TCHAR szName2[] = "Jim2\"test";
char szName3[] = "Jim3";
char szName3[] = "Jim3";
TCHAR szName4[] = _T("Jim");
TCHAR szName5[] = _T("Jim") ;
sprintf(szName5, "TCHAR szName=\"\"") ;

将被转换为:
#include "test.h"
TCHAR szName[] = _T("Jim");
TCHAR szName2[] = _T("Jim2\"test");
TCHAR szName3[] = _T("Jim3");
TCHAR szName3[] = _T("Jim3");
TCHAR szName4[] = _T("Jim");
TCHAR szName5[] = _T("Jim") ;
sprintf(szName5, "TCHAR szName=\"\"") ;
纠结的程序猿 2009-06-05
  • 打赏
  • 举报
回复
下载PilotEdit 2.5, http://topic.csdn.net/u/20090512/21/99628cbd-3c70-4d29-91ff-1962f01e7a7c.html

用下面的正则表达式查找替换:
查找:{jmp|djnz|cjne}?*[, ]?[a-z|A-Z|0-9|_]+[\t ]*$
替换为:%04


假设原始文件为:
#include "test.h"
TCHAR szName[] = "Jim";
TCHAR szName2[] = "Jim2\"test";
char szName3[] = "Jim3";
char szName3[] = "Jim3";
TCHAR szName4[] = _T("Jim");
TCHAR szName5[] = _T("Jim") ;
sprintf(szName5, "TCHAR szName=\"\"") ;

将被转换为:
#include "test.h"
TCHAR szName[] = _T("Jim");
TCHAR szName2[] = _T("Jim2\"test");
char szName3[] = _T("Jim3");
char szName3[] = _T("Jim3");
TCHAR szName4[] = _T("Jim");
TCHAR szName5[] = _T("Jim") ;
sprintf(szName5, "TCHAR szName=\"\"") ;
clever101 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 Delphigis 的回复:]
======================vc6.0====================================
char *szText = "我asd们的大中国qqwssadd";
size_t nLen = strlen(szText);
size_t nLenW = ::MultiByteToWideChar(CP_ACP,0,(const char *)szText,int(nLen),NULL,0);
WCHAR *wszText = new WCHAR[nLenW+1];
::MultiByteToWideChar(CP_ACP,0,(const char *)szText,int(nLen),wszText,int(nLenW));
wszText[nLenW] = L'\0';
MessageBoxExW(m_hWnd, wsz…
[/Quote]

这个不用了,《Windows核心编程》就有。单个转换没什么意义的。我的任务是要把整个工程的代码进行转换。
majun01 2009-06-04
  • 打赏
  • 举报
回复

用_T不保险,因为_T是一种“适配宏”,即:用它修饰的字符串既可以被用asc方式保存,也可以用unicade方式
保存,这要看编译环境的字符集了,如果它的字符集是asc的,那字符就会被用asc方式保存。

如果确定要将字符转换为unicode字符集代码,建议使用"L",这样不论在任何字符集编译环境下,字符都会被用unicade方式保存。
shinefen 2009-06-04
  • 打赏
  • 举报
回复
可以使用说 .工程项目属性中常规.字符集.设置为使用"多字符集"或者UNICODE.....
百事烟 2009-06-04
  • 打赏
  • 举报
回复
======================vc6.0====================================
char *szText = "我asd们的大中国qqwssadd";
size_t nLen = strlen(szText);
size_t nLenW = ::MultiByteToWideChar(CP_ACP,0,(const char *)szText,int(nLen),NULL,0);
WCHAR *wszText = new WCHAR[nLenW+1];
::MultiByteToWideChar(CP_ACP,0,(const char *)szText,int(nLen),wszText,int(nLenW));
wszText[nLenW] = L'\0';
MessageBoxExW(m_hWnd, wszText, L"123456", 0, 0);

======================vc2005===============================
WCHAR* CClientDlg::StrToWchar(CString strSrc)
{
size_t nLen = strSrc.GetLength()+1;
char *szText = new char[nLen];
sprintf_s(szText, nLen, "%s", strSrc);
size_t nLenW = ::MultiByteToWideChar(CP_ACP,0,(const char *)szText,int(nLen),NULL,0);
WCHAR *wszText = new WCHAR[nLenW+1];
::MultiByteToWideChar(CP_ACP,0,(const char *)szText,int(nLen),wszText,int(nLenW));
wszText[nLenW] = L'\0';
return wszText;
}
自己变下,也能从char*转
clever101 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 skyxie 的回复:]
引用 8 楼 clever101 的回复:
引用 7 楼 jennyvenus 的回复:
看你的程序是做什么用的,简单的替换就可以了,俺有个程序专门处理各种字符集转换,就只能手工修改了。


大侠,先不提函数替换了。先实现把常量字符串添加_T宏吧。


6楼 啊,兄弟~
[/Quote]

收到,大侠。回头给你分。不过得先试验一下你的表达式行不行。
skyxie 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 clever101 的回复:]
引用 7 楼 jennyvenus 的回复:
看你的程序是做什么用的,简单的替换就可以了,俺有个程序专门处理各种字符集转换,就只能手工修改了。


大侠,先不提函数替换了。先实现把常量字符串添加_T宏吧。
[/Quote]

6楼 啊,兄弟~
clever101 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jennyvenus 的回复:]
看你的程序是做什么用的,简单的替换就可以了,俺有个程序专门处理各种字符集转换,就只能手工修改了。
[/Quote]

大侠,先不提函数替换了。先实现把常量字符串添加_T宏吧。
用户 昵称 2009-06-04
  • 打赏
  • 举报
回复
看你的程序是做什么用的,简单的替换就可以了,俺有个程序专门处理各种字符集转换,就只能手工修改了。
skyxie 2009-06-04
  • 打赏
  • 举报
回复
Find:
".*[^.][^hH]"
clever101 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ncucf 的回复:]
http://topic.csdn.net/u/20090416/11/a9b4c762-19e7-4b21-984a-a4db2061e47c.html
[/Quote]

大侠,你就是我的救星啊!
clever101 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 skyxie 的回复:]
正则替换

Find:
".*"

Replace with:
_T(\0)

然后点替换,不过这这个模式没有办法区分
TCHAR szName[] = "Jim",

#include "xxx.h"

因此你不能replace all,而只能一个一个的看到替换,发现是应该替换的才替换
[/Quote]

大侠,一个个替换太麻烦了,有没有功能更强大的正则表达式啊。
ncucf 2009-06-04
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090416/11/a9b4c762-19e7-4b21-984a-a4db2061e47c.html
whoo 2009-06-04
  • 打赏
  • 举报
回复
毫无疑问需要正则表达式,用的不多也就不用深究,照着例子依葫芦画瓢的写一个就行了。 有时间了不妨再去仔细研究研究正则表达式。
skyxie 2009-06-04
  • 打赏
  • 举报
回复
正则替换

Find:
".*"

Replace with:
_T(\0)

然后点替换,不过这这个模式没有办法区分
TCHAR szName[] = "Jim",

#include "xxx.h"

因此你不能replace all,而只能一个一个的看到替换,发现是应该替换的才替换

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧