• locale.h setLocale


     前一篇文章 中,宽字符集 打印中文,还需要设置 locale

    locale.h 也不多,附上 头文件的源码

    View Code
    /***
    *locale.h - definitions/declarations for localization routines
    *
    *       Copyright (c) Microsoft Corporation. All rights reserved.
    *
    *Purpose:
    *       This file defines the structures, values, macros, and functions
    *       used by the localization routines.
    *
    *       [Public]
    *
    ****/
    
    #pragma once
    
    #ifndef _INC_LOCALE
    #define _INC_LOCALE
    
    #include <crtdefs.h>
    
    /*
     * Currently, all MS C compilers for Win32 platforms default to 8 byte
     * alignment.
     */
    #pragma pack(push,_CRT_PACKING)
    
    #ifdef  __cplusplus
    extern "C" {
    #endif
    
    /* define NULL pointer value */
    #ifndef NULL
    #ifdef __cplusplus
    #define NULL    0
    #else
    #define NULL    ((void *)0)
    #endif
    #endif
    
    /* Locale categories */
    
    #define LC_ALL          0
    #define LC_COLLATE      1
    #define LC_CTYPE        2
    #define LC_MONETARY     3
    #define LC_NUMERIC      4
    #define LC_TIME         5
    
    #define LC_MIN          LC_ALL
    #define LC_MAX          LC_TIME
    
    /* Locale convention structure */
    
    #ifndef _LCONV_DEFINED
    struct lconv {
            char *decimal_point;
            char *thousands_sep;
            char *grouping;
            char *int_curr_symbol;
            char *currency_symbol;
            char *mon_decimal_point;
            char *mon_thousands_sep;
            char *mon_grouping;
            char *positive_sign;
            char *negative_sign;
            char int_frac_digits;
            char frac_digits;
            char p_cs_precedes;
            char p_sep_by_space;
            char n_cs_precedes;
            char n_sep_by_space;
            char p_sign_posn;
            char n_sign_posn;
            wchar_t *_W_decimal_point;
            wchar_t *_W_thousands_sep;
            wchar_t *_W_int_curr_symbol;
            wchar_t *_W_currency_symbol;
            wchar_t *_W_mon_decimal_point;
            wchar_t *_W_mon_thousands_sep;
            wchar_t *_W_positive_sign;
            wchar_t *_W_negative_sign;
            };
    #define _LCONV_DEFINED
    #endif
    
    /* ANSI: char lconv members default is CHAR_MAX which is compile time
       dependent. Defining and using _charmax here causes CRT startup code
       to initialize lconv members properly */
    
    #ifdef  _CHAR_UNSIGNED
    extern int _charmax;
    extern __inline int __dummy(void) { return _charmax; }
    #endif
    
    /* function prototypes */
    
    #ifndef _CONFIG_LOCALE_SWT
    #define _ENABLE_PER_THREAD_LOCALE           0x1
    #define _DISABLE_PER_THREAD_LOCALE          0x2
    #define _ENABLE_PER_THREAD_LOCALE_GLOBAL    0x10
    #define _DISABLE_PER_THREAD_LOCALE_GLOBAL   0x20
    #define _ENABLE_PER_THREAD_LOCALE_NEW       0x100
    #define _DISABLE_PER_THREAD_LOCALE_NEW      0x200
    #define _CONFIG_LOCALE_SWT
    #endif
    
    _Check_return_opt_ _CRTIMP int __cdecl _configthreadlocale(_In_ int _Flag);
    _Check_return_opt_ _CRTIMP char * __cdecl setlocale(_In_ int _Category, _In_opt_z_ const char * _Locale);
    _Check_return_opt_ _CRTIMP struct lconv * __cdecl localeconv(void);
    _Check_return_opt_ _CRTIMP _locale_t __cdecl _get_current_locale(void);
    _Check_return_opt_ _CRTIMP _locale_t __cdecl _create_locale(_In_ int _Category, _In_z_ const char * _Locale);
    _CRTIMP void __cdecl _free_locale(_In_opt_ _locale_t _Locale);
    
    /* use _get_current_locale, _create_locale and _free_locale, instead of these functions with double leading underscore */
    _Check_return_ _CRT_OBSOLETE(_get_current_locale) _CRTIMP _locale_t __cdecl __get_current_locale(void);
    _Check_return_ _CRT_OBSOLETE(_create_locale) _CRTIMP _locale_t __cdecl __create_locale(_In_ int _Category, _In_z_ const char * _Locale);
    _CRT_OBSOLETE(_free_locale) _CRTIMP void __cdecl __free_locale(_In_opt_ _locale_t _Locale);
    
    #ifndef _WLOCALE_DEFINED
    
    /* wide function prototypes, also declared in wchar.h  */
    
    _Check_return_opt_ _CRTIMP wchar_t * __cdecl _wsetlocale(_In_ int _Category, _In_opt_z_ const wchar_t * _Locale);
    
    #define _WLOCALE_DEFINED
    #endif
    
    #ifdef  __cplusplus
    }
    #endif
    
    #pragma pack(pop)
    
    #endif  /* _INC_LOCALE */

    关于为什么 要设置locale才能在wprintf打印中文的讨论见:

    http://topic.csdn.net/u/20120331/18/0e806bd0-28d4-4012-9a32-ab99cc16e554.html

    (csdn某些地方 很让人讨厌)

    获得当前的locale

    //in crtdef.h
    
    struct threadlocaleinfostruct;
    struct threadmbcinfostruct;
    typedef struct threadlocaleinfostruct * pthreadlocinfo;
    typedef struct threadmbcinfostruct * pthreadmbcinfo;
    struct __lc_time_data;
    
    typedef struct localeinfo_struct
    {
        pthreadlocinfo locinfo;
        pthreadmbcinfo mbcinfo;
    } _locale_tstruct, *_locale_t;
    
    
    //
    _locale_t ret=_get_current_locale();
    
    _free_locale(ret);
    typedef struct threadlocaleinfostruct {
            int refcount;
            unsigned int lc_codepage;
            unsigned int lc_collate_cp;
            unsigned long lc_handle[6]; /* LCID */
            LC_ID lc_id[6];
            struct {
                char *locale;
                wchar_t *wlocale;
                int *refcount;
                int *wrefcount;
            } lc_category[6];
            int lc_clike;
            int mb_cur_max;
            int * lconv_intl_refcount;
            int * lconv_num_refcount;
            int * lconv_mon_refcount;
            struct lconv * lconv;
            int * ctype1_refcount;
            unsigned short * ctype1;
            const unsigned short * pctype;
            const unsigned char * pclmap;
            const unsigned char * pcumap;
            struct __lc_time_data * lc_time_curr;
    } threadlocinfo;
    threadmbcinfostruct这个结构体 暂时没有找到。
    如何打印出来 _locale_t 指针所代表的 locale 也不知道。

    setLocale的返回值

            char   *old_locale; 
            old_locale   =   setlocale(LC_ALL, ""); //setlocale(LC_CTYPE, NULL);  
            printf( "Old   locale   was   :\n%s\n ",old_locale); 

    设置locale

    setlocale(LC_CTYPE, "chs");
    
    //下面的代码 意思 也不太清楚
    TCHAR szACP[16];
    
    wsprintf(szACP, _T(".%d"), GetACP());
    
    _tsetlocale(LC_CTYPE, szACP);
    
    setlocale(LC_CTYPE, "");

    反正 用处 也不是很多。

    只要知道 如何 wprintf 输出中文的时候就行了。

  • 相关阅读:
    ES6~Promise的原理及使用二 理解Promise规范(copy自:https://www.cnblogs.com/lvdabao/p/5320705.html?utm_source=tuicool&utm_medium=referral)
    Google的Python代码格式化工具YAPF详解
    在ubuntu上使用QQ的经历
    Ubuntu 14.04 下安装Skype
    pip install lxml mysql-python error
    情人节的宠物-测试小工具
    戴维营收集
    工作日志(10.29)
    求职面试
    面试题集(转载)
  • 原文地址:https://www.cnblogs.com/ayanmw/p/2672984.html
Copyright © 2020-2023  润新知