>128的ascii码转换成字符,怎么出现乱码?

test2002 2010-02-27 10:56:51
比如

int i='.';
char c;
c=i

这个c不是我要的'.',而变成了'.'
...全文
2679 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
白云飘飘飘 2010-02-27
  • 打赏
  • 举报
回复
你用西方字符集吧.............
test2002 2010-02-27
  • 打赏
  • 举报
回复
那怎么解决》128的字符转换?
test2002 2010-02-27
  • 打赏
  • 举报
回复
怎么查呀,实际上0-127,正常的,超过127就不正常了,不信你试一下。
比如

int i='.';
char c;
c=i
CString s;
s.Format("%c",c)
AfxMessageBox(s);

看到的不是'.',而是'?'
大风扯 2010-02-27
  • 打赏
  • 举报
回复
所有大于 127 的全部变为 “?”的

所以转字符串的时候要小心。。

大风扯 2010-02-27
  • 打赏
  • 举报
回复
这个我也碰到过,查过原因是在vs2008里 ASCII码是7位的 表示的0 -127 吧

大于的就是乱码了。。

jyh_baoding 2010-02-27
  • 打赏
  • 举报
回复
查查内存中还是.的ACSII吗
test2002 2010-02-27
  • 打赏
  • 举报
回复
搞错,是变成‘?’了
上海程序员3 2010-02-27
  • 打赏
  • 举报
回复
你这前后两个点有什么区别,怎么我的内眼看不出来区别。
test2002 2010-02-27
  • 打赏
  • 举报
回复
45楼的应该也可行,只是效率慢点。
其实做个数组就可行了
char ch[2][255]={'.................'};
把可显示的字符放在数组里,不可显示的用?放在数组中。只要做准确了。就很快

使用的时候用 ch[shietStatte][keycode]就可以了
如我上面的用 ch[0][190],结果就='.'了。
stjay 2010-02-27
  • 打赏
  • 举报
回复
要么这样,
SendMessage(WM_KEYDOWN)按键值到自己创建的(隐藏)窗口(编辑框)中,
然后(在其WM_CHAR里)保存下来

如果有详细的准确资料,可自行转换实现算法
yhp1888 2010-02-27
  • 打赏
  • 举报
回复
引用 43 楼 test2002 的回复:
VK_OEM_PERIOD            BE                    Windows 2000/XP: For any country/region, the '>.' key


原来它的名字叫VK_OEM_PERIOD


呵呵,我曾经还不知道VK_OEM_PERIOD是什么键呢,在键盘上到处找,没有“PERIOD”这个键呀!
查一下英文单词“PERIOD”是“句点”,才知道了。
test2002 2010-02-27
  • 打赏
  • 举报
回复
VK_OEM_PERIOD BE Windows 2000/XP: For any country/region, the '>.' key


原来它的名字叫VK_OEM_PERIOD
test2002 2010-02-27
  • 打赏
  • 举报
回复
找出来了,是个OEM键值:
#define VK_LBUTTON 0x01 输入笔点击
#define VK_RBUTTON 0x02 鼠标右键
#define VK_CANCEL 0x03 Control-Break处理
#define VK_MBUTTON 0x04 /* NOT contiguous with L & RBUTTON */ 鼠标中间键

#define VK_BACK 0x08 Backspace键
#define VK_TAB 0x09 Tab键

#define VK_CLEAR 0x0C Clear键
#define VK_RETURN 0x0D Enter键

#define VK_SHIFT 0x10 Shift键
#define VK_CONTROL 0x11 Ctrl键
#define VK_MENU 0x12 Alt键
#define VK_PAUSE 0x13
#define VK_CAPITAL 0x14 Caps lock键

#define VK_KANA 0x15
#define VK_HANGEUL 0x15 /* old name - should be here for compatibility */
#define VK_HANGUL 0x15
#define VK_JUNJA 0x17
#define VK_FINAL 0x18
#define VK_HANJA 0x19
#define VK_KANJI 0x19

#define VK_ESCAPE 0x1B Escape键

#define VK_CONVERT 0x1C
#define VK_NONCONVERT 0x1D
#define VK_ACCEPT 0x1E
#define VK_MODECHANGE 0x1F

#define VK_SPACE 0x20 空格键
#define VK_PRIOR 0x21 Page up键
#define VK_NEXT 0x22 Page down键
#define VK_END 0x23 End键
#define VK_HOME 0x24 Home键
#define VK_LEFT 0x25 左箭头键
#define VK_UP 0x26 上箭头键
#define VK_RIGHT 0x27 右箭头键
#define VK_DOWN 0x28 下箭头键
#define VK_SELECT 0x29 Select键
#define VK_PRINT 0x2A
#define VK_EXECUTE 0x2B Execute键
#define VK_SNAPSHOT 0x2C Print screen键
#define VK_INSERT 0x2D Insert键
#define VK_DELETE 0x2E Delete键
#define VK_HELP 0x2F Help键

/* VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
/* VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */

#define VK_LWIN 0x5B
#define VK_RWIN 0x5C
#define VK_APPS 0x5D

#define VK_NUMPAD0 0x60 数字小键盘上的0
#define VK_NUMPAD1 0x61
#define VK_NUMPAD2 0x62
#define VK_NUMPAD3 0x63
#define VK_NUMPAD4 0x64
#define VK_NUMPAD5 0x65
#define VK_NUMPAD6 0x66
#define VK_NUMPAD7 0x67
#define VK_NUMPAD8 0x68
#define VK_NUMPAD9 0x69
#define VK_MULTIPLY 0x6A 数字小键盘上的*
#define VK_ADD 0x6B 数字小键盘上的+
#define VK_SEPARATOR 0x6C 分隔符键
#define VK_SUBTRACT 0x6D 数字小键盘上的-
#define VK_DECIMAL 0x6E 数字小键盘上的.
#define VK_DIVIDE 0x6F 数字小键盘上的/
#define VK_F1 0x70
#define VK_F2 0x71
#define VK_F3 0x72
#define VK_F4 0x73
#define VK_F5 0x74
#define VK_F6 0x75
#define VK_F7 0x76
#define VK_F8 0x77
#define VK_F9 0x78
#define VK_F10 0x79
#define VK_F11 0x7A
#define VK_F12 0x7B
#define VK_F13 0x7C
#define VK_F14 0x7D
#define VK_F15 0x7E
#define VK_F16 0x7F
#define VK_F17 0x80
#define VK_F18 0x81
#define VK_F19 0x82
#define VK_F20 0x83
#define VK_F21 0x84
#define VK_F22 0x85
#define VK_F23 0x86
#define VK_F24 0x87

#define VK_0 ... VK_9 0x30 - 0x39 0-9键
#define VK_A ... VK_Z 0x41 - 0x5A A-Z键


#define VK_NUMLOCK 0x90
#define VK_SCROLL 0x91 Scroll Lock

/*
* VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
* Used only as parameters to GetAsyncKeyState() and GetKeyState().
* No other API or message will distinguish left and right keys in this way.
*/
#define VK_LSHIFT 0xA0
#define VK_RSHIFT 0xA1
#define VK_LCONTROL 0xA2
#define VK_RCONTROL 0xA3
#define VK_LMENU 0xA4 左Alt键
#define VK_RMENU 0xA5 右Alt键

#if(WINVER >= 0x0400)
#define VK_PROCESSKEY 0xE5
#endif /* WINVER >= 0x0400 */

#define VK_ATTN 0xF6
#define VK_CRSEL 0xF7
#define VK_EXSEL 0xF8
#define VK_EREOF 0xF9
#define VK_PLAY 0xFA
#define VK_ZOOM 0xFB
#define VK_NONAME 0xFC
#define VK_PA1 0xFD
#define VK_OEM_CLEAR 0xFE

VK_OEM_1 BA Used for miscellaneous characters; it can vary by keyboard.
Windows 2000/XP: For the US standard keyboard, the ';:' key

VK_OEM_PLUS BB Windows 2000/XP: For any country/region, the '=+' key

VK_OEM_COMMA BC Windows 2000/XP: For any country/region, the ',<' key

VK_OEM_MINUS BD Windows 2000/XP: For any country/region, the '-_' key

VK_OEM_PERIOD BE Windows 2000/XP: For any country/region, the '>.' key

VK_OEM_2 BF Used for miscellaneous characters; it can vary by keyboard.
Windows 2000/XP: For the US standard keyboard, the '/?' key

VK_OEM_3 C0 Used for miscellaneous characters; it can vary by keyboard.
Windows 2000/XP: For the US standard keyboard, the '`~' key

- C1-D7 Reserved
- D8-DA Unassigned

VK_OEM_4 DB Used for miscellaneous characters; it can vary by keyboard.
Windows 2000/XP: For the US standard keyboard, the '[{' key

VK_OEM_5 DC Used for miscellaneous characters; it can vary by keyboard.
Windows 2000/XP: For the US standard keyboard, the '\|' key

VK_OEM_6 DD Used for miscellaneous characters; it can vary by keyboard.
Windows 2000/XP: For the US standard keyboard, the ']}' key

VK_OEM_7 DE Used for miscellaneous characters; it can vary by keyboard.
Windows 2000/XP: For the US standard keyboard, the '' "' key

yhp1888 2010-02-27
  • 打赏
  • 举报
回复
是啊,你有“键值对应表”就好办了,你要的功能就可以出来了。
yhp1888 2010-02-27
  • 打赏
  • 举报
回复
引用 37 楼 test2002 的回复:
只是不明白,这些翻译函数没有现成的吗?要自己编?


电脑,字符处理只是它的一个小功能,更多的功能是控制、计算等等,为什么要有“翻译函数”?
人家做电脑的人都是在想办法处理它的键值,你只是你目前的一个“小小心愿”,想得到键值对应的字符。
要知道,(键盘)键值很多,(键盘)字符很少。
CTL+键、ALT+键、。。。。都有键值的,却无法对应出字符。
hackwolfoscar 2010-02-27
  • 打赏
  • 举报
回复
....................
test2002 2010-02-27
  • 打赏
  • 举报
回复
键值对应表:
描述\r
0x1 鼠标左键\r
0x2 鼠标右键\r
0x3 CANCEL 键\r
0x4 鼠标中键\r
0x8 BACKSPACE 键\r
0x9 TAB 键\r
0xC CLEAR 键\r
0xD ENTER 键\r
0x10 SHIFT 键\r
0x11 CTRL 键\r
0x12 MENU 键\r
0x13 PAUSE 键\r
0x14 CAPS LOCK 键\r
0x1B ESC 键\r
0x20 SPACEBAR 键\r
0x21 PAGE UP 键\r
0x22 PAGE DOWN 键\r
0x23 END 键\r
0x24 HOME 键\r
0x25 LEFT ARROW 键\r
0x26 UP ARROW 键\r
0x27 RIGHT ARROW 键\r
0x28 DOWN ARROW 键\r
0x29 SELECT 键\r
0x2A PRINT SCREEN 键\r
0x2B EXECUTE 键\r
0x2C SNAPSHOT 键\r
0x2D INSERT 键\r
0x2E DELETE 键\r
0x2F HELP 键\r
0x90 NUM LOCK 键\r
A 至 Z 键与 A – Z 字母的 ASCII 码相同:
值 描述\r
65 A 键\r
66 B 键\r
67 C 键\r
68 D 键\r
69 E 键\r
70 F 键\r
71 G 键\r
72 H 键\r
73 I 键\r
74 J 键\r
75 K 键\r
76 L 键\r
77 M 键\r
78 N 键\r
79 O 键\r
80 P 键\r
81 Q 键\r
82 R 键\r
83 S 键\r
84 T 键\r
85 U 键\r
86 V 键\r
87 W 键\r
88 X 键\r
89 Y 键\r
90 Z 键\r
0 至 9 键与数字 0 – 9 的 ASCII 码相同:
值 描述\r
48 0 键\r
49 1 键\r
50 2 键\r
51 3 键\r
52 4 键\r
53 5 键\r
54 6 键\r
55 7 键\r
56 8 键\r
57 9 键\r
下列常数代表数字键盘上的键:
值 描述\r
0x60 0 键\r
0x61 1 键\r
0x62 2 键\r
0x63 3 键\r
0x64 4 键\r
0x65 5 键\r
0x66 6 键\r
0x67 7 键\r
0x68 8 键\r
0x69 9 键\r
0x6A MULTIPLICATION SIGN (*) 键\r
0x6B PLUS SIGN (+) 键\r
0x6C ENTER 键\r
0x6D MINUS SIGN (–) 键\r
0x6E DECIMAL POINT (.) 键\r
0x6F DIVISION SIGN (/) 键\r
下列常数代表功能键:
值 描述\r
0x70 F1 键\r
0x71 F2 键\r
0x72 F3 键\r
0x73 F4 键\r
0x74 F5 键\r
0x75 F6 键\r
0x76 F7 键\r
0x77 F8 键\r
0x78 F9 键\r
0x79 F10 键\r
0x7A F11 键\r
0x7B F12 键\r
0x7C F13 键\r
0x7D F14 键\r
0x7E F15 键\r
0x7F F16 键\r
test2002 2010-02-27
  • 打赏
  • 举报
回复
我看了一下VB的keydown,明白了,

字符=键值+shift状态

shift=0,'w'
shitf=1 'W'

同样 shift=0,键值190则为'.'=46
shift=1,键值190则翻译为'>'

只是不明白,这些翻译函数没有现成的吗?要自己编?
yhp1888 2010-02-27
  • 打赏
  • 举报
回复
比如:
switch(pMsg->wParam)
{
case 65:
m_char = _T('A');
break;
case 190:
m_char = _T('.');
break;
case 32:
m_char = _T("空格");
break;
case 127:
m_char = _T("删除");
break;
.............
}

如果你没有积累键值与字符对应的资料,你就搞个小程序,把键盘上的键部全敲个遍,输出按键对应的字符。把对应的字符都记下来。

你还可以查找你的VC安装盘下,包含“VK_???”如VK_F1,VK_RETURN,....的头文件,收集一下全部“VK”打头的虚键。
test2002 2010-02-27
  • 打赏
  • 举报
回复
你说的我明白了,
每个键盘对应一个值,不管w,还是W,都对应一个值,这里键值='W',

KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)

现在我就想做一个相当于翻译程序,把用户按的键,由上面的参数,由键值翻译成各种字符,

请问怎么翻译,因为回调函数中给了 wParam,lParam,肯定足够信息翻译成字符了。
加载更多回复(26)

16,550

社区成员

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

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

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