一个看似简单而又不简单的问题

jisusoft 2006-10-30 06:39:55
在VC++定义一个Unicode字符串可以按如下方式定义:
(1)wchar_t ws[]=L"Hi!";
(2)unsigned short ws[]=L"Hi!";
这需要编译器能够对L处理,但如果编译器不支持L"Hi!"这种方式,如何在标准C中实现这一简单功能呢?

也就是定义一个可变大小的unsigned short数组,让编译器分配内存,我想到的一种笨方法:
#define WIDESTRING1(s) {s[0],0}
#define WIDESTRING2(s) {s[0],s[1],0}
#define WIDESTRING3(s) {s[0],s[1],s[2],0}
.....................................
#define WIDESTRINGN(s) {s[0],...,s[N-1],0}

这样定义,N肯定要限定在一定范围内,使用时就更麻烦了,还要知道字符串到底多长。


最好使用宏命令解决,而不要使用函数的方式实现,因为那样就不必问这个问题了。
...全文
459 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Muf 2006-11-08
  • 打赏
  • 举报
回复
编译器在遇到"L"的时候,会用当前系统编码,将字串转换成Unicode编码。
因此,要想在不支持"L"的C编译器上实现这个功能,只有几个建议:
1. 如果该编译器支持Unicode格式的源码文件--好象有点废话,这个都支持了,不可能不支持"L"的。
2. 手工将字串的Unicode码写到数组中去--也是废话,楼主就是不想这么累

3. 自已写一个,或去网上找一个预处理的工具,查找源代码,发现 L"..."的地方,替代成Unicode的数组。
jisusoft 2006-11-07
  • 打赏
  • 举报
回复
看来这个问题只有高高手才会或者无解了
jisusoft 2006-11-01
  • 打赏
  • 举报
回复
虽然想用的是Unicode,但这里只是一个技术问题,和utf-8或utf-16的源码文件可以说没有直接关系
Muf 2006-11-01
  • 打赏
  • 举报
回复
直接使用utf-8或utf-16的源码文件行不?
jisusoft 2006-11-01
  • 打赏
  • 举报
回复
感谢hailongchang的回复,但那样就违背我的原意了(不想用函数实现)
hailongchang 2006-11-01
  • 打赏
  • 举报
回复
用char声明一个字符数组,然后写一个函数 把他们转化为unsigned short类型

注意一点,在wide character中,一个字符是两个字节,所以表示是这样的:
0xc4,0x00,同样最后的结束字符也应该是0x00,0x00
jisusoft 2006-11-01
  • 打赏
  • 举报
回复
如果宏里面能用循环就好了,可是不能啊
jisusoft 2006-11-01
  • 打赏
  • 举报
回复
left_zxp所说的方法最终还是会变成L"Hi!"的,所以没有解决这个问题
jisusoft 2006-11-01
  • 打赏
  • 举报
回复
目前我用的还是zhounw使用的方法,但我想使用一个更加好的方法,最好能够保留"Hi!"这种形式
刀疤哥 2006-10-30
  • 打赏
  • 举报
回复
#define WCHAR unsigned short
WCHAR ws[] = {'H', 'i', 0};

判断时,就判断ws[i]是否等于0就行了.
left_zxp 2006-10-30
  • 打赏
  • 举报
回复
只知道在win32内用TEXT()来表示,标准C不知道

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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