• 04 Windows编程——Unicode


    VS 2017下源码

     1 #include<stdio.h>
     2 
     3 int main()
     4 {
     5     char ASC_a = 'a';
     6     char *ASC_str = "hello";
     7     wchar_t W_a = 'a';
     8     wchar_t *W_str = "hello";
     9     printf("ASC_a = %c
    ", ASC_a);
    10     printf("sizeof(ASC_a) = %d
    ", sizeof(ASC_a));
    11     printf("ASC_str = %s
    ", ASC_str);
    12     /* 打印ASC_a的内存 */
    13     printf("ASC_a = 0x%x
    ", &ASC_a);
    14 
    15     printf("W_a = %c
    ", W_a);
    16     printf("sizeof(W_a) = %d
    ", sizeof(W_a));
    17     printf("W_str = %s
    ", W_str);
    18     /* 打印W_a的内存 */
    19     printf("W_a = 0x%x,0x%x
    ", *((char*)&W_a), *(((char*)&W_a)+1));
    20 
    21     getchar();
    22     return 0;
    23 }
    View Code

    运行结果

    wchar_t *W_str = "hello"; 

    对于宽字符串,如果使用printf("W_str = %s ", W_str);可能不会打印出完整的字符串,而只显示第一个字符。

    其原因是因为:宽字符占用2Byte,第二个字节就是。printf以为自己到头了,所以只打印一个字节。对printf使用%S参数,或者使用wprintf来避免这一问题。我手上的是VS 2017,使用printf("W_str = %s ", W_str);居然也可以正常打印,其他版本的VS估计不行。

    如果是其他版本的VS,可能需要在宽字符前面加L,打印宽字符串需要使用%S。这时候源码如下

     1 #include<stdio.h>
     2 
     3 int main()
     4 {
     5     char ASC_a = 'a';
     6     char *ASC_str = "hello";
     7     wchar_t W_a = L'a';
     8     wchar_t *W_str = L"hello";
     9     printf("ASC_a = %c
    ", ASC_a);
    10     printf("sizeof(ASC_a) = %d
    ", sizeof(ASC_a));
    11     printf("ASC_str = %s
    ", ASC_str);
    12     /* 打印ASC_a的内存 */
    13     printf("ASC_a = 0x%x
    ", &ASC_a);
    14 
    15     printf("W_a = %c
    ", W_a);
    16     printf("sizeof(W_a) = %d
    ", sizeof(W_a));
    17     printf("W_str = %S
    ", W_str);
    18     /* 打印W_a的内存 */
    19     printf("W_a = 0x%x,0x%x
    ", *((char*)&W_a), *(((char*)&W_a)+1));
    20 
    21     getchar();
    22     return 0;
    23 }
    View Code

    还可以使用TCHAR无脑处理Unicode ASCII。如果定义了_UNICODE,那么TCHAR = wchar_t,否则位char。如果定义了_UNICODE,那么_TEXT=L,否则_TEXT=空 

     1 #include<tchar.h>
     2 
     3 int main()
     4 {
     5     TCHAR ASC_a = 'a';
     6     TCHAR *ASC_str = "hello";
     7     TCHAR W_a = L'a';
     8     TCHAR *W_str = L"hello";
     9     _tprintf(_TEXT("ASC_a = %c
    "), ASC_a);
    10     _tprintf(_TEXT("sizeof(ASC_a) = %d
    "), sizeof(ASC_a));
    11     _tprintf(_TEXT("ASC_str = %s
    "), ASC_str);
    12     /* 打印ASC_a的内存 */
    13     _tprintf(_TEXT("ASC_a = 0x%x
    "), &ASC_a);
    14 
    15     _tprintf(_TEXT("W_a = %c
    "), W_a);
    16     _tprintf(_TEXT("sizeof(W_a) = %d
    "), sizeof(W_a));
    17     _tprintf(_TEXT("W_str = %s
    "), W_str);
    18     /* 打印W_a的内存 */
    19     _tprintf(_TEXT("W_a = 0x%x,0x%x
    "), *((char*)&W_a), *(((char*)&W_a)+1));
    20 
    21     _gettchar();
    22     return 0;
    23 }
    View Code

     如果包含了Windows.h,就不用写_TEXT了,使用TEXT

  • 相关阅读:
    weblogic无需用户名密码启动Server
    中文和unicode互转
    spring集成activeMQ
    jvm分析(MD语法)
    解决java.lang.NoClassDefFoundError: org/apache/log4j/Level
    httpclient 支持代理和http & https
    容器配置jndi Tomcat为例
    java https tomcat 单双认证(含证书生成和代码实现) 原创转载请备注,谢谢O(∩_∩)O
    java Http原生 Get 和Post 支持代理认证
    解决客户端访问https报错
  • 原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/9298591.html
Copyright © 2020-2023  润新知