• 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

  • 相关阅读:
    java.lang.NoSuchFieldError: No static field abc_ic_ab_back_mtrl_am_alpha of type I in class Landroid/support/v7/appcompat/R$drawable
    android 监听动画对象后不能播放动画
    Genymotion模拟器出现INSTALL_FAILED_NO_MATCHING_ABIS 的解决办法
    Android studio 怎么使用单元测试(不需要device)
    在Android 5.0中使用JobScheduler(转载)
    AndroidStudio2.2 Preview3中NDK开发之CMake和传统 JNI在目录结构和配置文件上的区别(转载)
    Android 进程保活招式大全(转载)
    ambari初始化登陆账号/密码假如不是admin/admin
    android studio logcat 换行(日志换行)
    在Android Studio进行“简单配置”单元测试(Android Junit)
  • 原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/9298591.html
Copyright © 2020-2023  润新知