社区
C#
帖子详情
一个char的UNICODE互换的怪问题。
xiaoming851
2007-07-12 05:13:38
代码如下:
char cn = '識';
long uc = 16775676;
MessageBox.Show(":" + uc + ":" + (char)uc + ":" + (long)cn + ":");
输出结果:
:16775676:識:35672:
按理说(long)cn的值应该是16775676,可为什么变成了35672?
谢谢达人!
...全文
658
28
打赏
收藏
一个char的UNICODE互换的怪问题。
代码如下: char cn = '識'; long uc = 16775676; MessageBox.Show(":" + uc + ":" + (char)uc + ":" + (long)cn + ":"); 输出结果: :16775676:識:35672: 按理说(long)cn的值应该是16775676,可为什么变成了35672? 谢谢达人!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
28 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cancerser
2007-07-12
打赏
举报
回复
这样就结了,我刚找出解法,看来算了~
viena
2007-07-12
打赏
举报
回复
16775676对65536(2的16次方)取余是35672而以,而16775676任意加减65536的倍数,效果也一样~
viena
2007-07-12
打赏
举报
回复
35672加上65536的整数倍得到的数,强制转换为char,得到的都是相同的'識'
sd5923150
2007-07-12
打赏
举报
回复
我再补充一下 啊
char:存储16位Unicode字符。Char变量的最小可能值为值为0的Unicode字符,最大可能值为值为655535的Unicode字符。
long:存储64位带符号整数。long变量的最小可能值为-9223372036845775808,最大可能值为9223372036845775807。
那你自己去算算吧
viena
2007-07-12
打赏
举报
回复
结贴点管理,给分输入密码就可以了
long是64位整数
你把16775676这个数放到long里面,恰好它的低16位是35672而以
而低16位是35672的long型整数多到你数几辈子都数不清
sd5923150
2007-07-12
打赏
举报
回复
是啊。你那显示转换的时候,长度如果不同,多出部分会被截取掉的。
而且我也同意 viena() 维也纳() 的观点,并不是每个数据类型转换都是可逆的
而且在C#中还可以通过隐性转换(不会造成数据丢失)或显性转换(可能造成数据丢失或降低精确度)来改变数据类型。
你去看看数据类型的资料吧。
xiaoming851
2007-07-12
打赏
举报
回复
在问个问题,怎么结贴?
-_-#
cancerser
2007-07-12
打赏
举报
回复
学习下 try中……
xiaoming851
2007-07-12
打赏
举报
回复
to 维也纳:
谢谢,我记住了!!非常感谢你的回答!结贴!
viena
2007-07-12
打赏
举报
回复
没有办法
viena
2007-07-12
打赏
举报
回复
谁告诉你所有的转换都是可逆的?
xiaoming851
2007-07-12
打赏
举报
回复
to 维也纳:
那就是说已经没有办法从'識'字获得16775676了???
xiaoming851
2007-07-12
打赏
举报
回复
to Macosx:
那就是说已经没有办法从'識'字获得16775676了???
viena
2007-07-12
打赏
举报
回复
你把代码代改成这样就知道了,实际上从long到char的强制转换,是会发生溢出的,高位信息都被丢掉了
char cn = '識';
long uc = 16775676;
MessageBox.Show(":" + uc + ":" + checked((char)uc) + ":" + (long)cn + ":");
另外 16775676用int可以放得下的,没必要用long
Macosx
2007-07-12
打赏
举报
回复
viena一语中的
xiaoming851
2007-07-12
打赏
举报
回复
to 维也纳:
我通过javascript里边的 String.fromCharCode(16775676) 得到了字符'識',并且在C#里边强制类型转换也可以得到'識',我想一定可以通过'識'字符反像获得16775676,你觉得呢?
viena
2007-07-12
打赏
举报
回复
//按理说(long)cn的值应该是16775676
你按的什么理?
char是Unicode字符,16位两个字节,值的范围0到65535
16775676强制转换为char,是丢掉了高位而以,已经丢失信息了,怎么可能还原?
xiaoming851
2007-07-12
打赏
举报
回复
to 杨东:
谢谢你,可是你给的例子我看不大明白,望指教。
xiaoming851
2007-07-12
打赏
举报
回复
to 维也纳:
你好,我是说我通过16775676得到了字符'識',现在我怎么通过字符'識'得到16775676这个值?
viena
2007-07-12
打赏
举报
回复
它的值就是35672啊
加载更多回复(8)
GB2312, BIG5, UTF8,
Unicode
之间的
互换
char
* UTF8ToGB2312(const
char
* pStrUTF8) { // 先转成宽字符 int nStrLen = MultiByteToWide
Char
(CP_UTF8, 0, pStrUTF8, -1, NULL, 0); w
char
_t* pWStr = new w
char
_t[nStrLen + 1]; memset(pWStr, 0, nStrLen + 1);
ANSI
Char
* 和
Unicode
Char
*
互换
//------------------------------------------------------------------------------------- //Description: // This function maps a
char
acter string to a wide-
char
acter (
Unicode
) string // //Parameters
Unicode
下CString(w
char
_t)转换为
char
*
Unicode
下CString(w
char
_t)转换为
char
*
wstring Mult
CHar
ToWide
Char
(string str)
{
//获取缓冲区的大小,并申请空间,缓冲区大小是按字符计算的
int len=MultiByteToWide
Char
(CP_ACP,0,str.c_str(),str.size(),NULL,0);
T
CHAR
*buffer=new T
CHAR
[len+1];
//多字节编码转换
CString与
char
*互转总结
转自作者:flydream0 原文链接:https://blog.csdn.net/flydream0/article/details/8543525/ 1 前言 今天在网上看论坛,发现大家对CString与
Char
*互转各说一词,其实我发现提问者所说的情况与回答
问题
的人完全不是同一情况,这里做一总结. 首先大家得清楚一件事,一般在网上提出
问题
的人大部分使用的都是VC,那么你就应该知道,在VC下编程,工程属性中有一属性
Char
ecter Set属性,其值可以设置为Use Multi-Byte
Char
ec
C#
111,129
社区成员
642,536
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章