·ÎÄÉÀÏ(Locale)¿¡ °üÇÏ¿©...

  1. ·ÎÄÉÀÏ(Locale)ÀÇ ÀǹÌ
  2.  ¼¼°è ¿©·¯ ³ª¶óµéÀº °¢ÀÚ ´Ù¸¥ ¹®È­(¾ð¾î, ³¯Â¥, ½Ã°£ µî)À» °®°í ÀÖ´Ù. ÇÁ·Î±×·¥ÀÇ
    ±¹Á¦È­(Internationalization, ÁÙ¿©¼­ i18n)´Â »ç¿ëÀÚ·Î ÇÏ¿©±Ý ÇÁ·Î±×·¥ ¼öÇà½Ã
    ·ÎÄÉÀÏÀ̶õ °Í¿¡ ÀÇÇØ ÀÔ¸À¿¡ ¸Â´Â ȯ°æÀ» ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ¸¸µç °ÍÀ» ¸»ÇÑ´Ù.
    ¿¹¸¦ µé¾î ¾î¶² ÇÁ·Î±×·¥ÀÇ ¸Þ½ÃÁö°¡ ¿©·¯°¡Áö ¾ð¾î·Î ÁÖ¾îÁ® ÀÖ´Â °æ¿ì ÀÌÁß¿¡
    ¾î¶² ¾ð¾îÀÇ °ÍÀ» Ãâ·ÂÇÒ °ÍÀΰ¡¸¦ »ç¿ëÀÚ°¡ °áÁ¤ÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ±×°ÍÀ» 
    °¡´ÉÇÏ°Ô ÇØ ÁÖ´Â ¼ö´ÜÀÌ ¹Ù·Î ·ÎÄÉÀÏÀÌ´Ù. ÀÌ°ÍÀº ´Ü¼øÈ÷ ¸Þ½ÃÁö »Ó¸¸ÀÌ ¾Æ´Ï°í
    ¼ýÀÚÇ¥Çö¹ý, ³¯Â¥ ¶Ç´Â ½Ã°£Ç¥Çö¹ý µî ¿©·¯°¡Áö¿¡ »ç¿ëµÉ ¼ö ÀÖ´Ù. ±×°Í °¢°¢À»
    ¿ì¸®´Â Ä«Å×°í¸®(category)¶ó°í ºÎ¸¥´Ù. Ä«Å×°í¸®¿¡´Â LC_COLLATE, LC_CTYPE,
    LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME °¡ ÀÖ´Ù.
    

  3. ·ÎÄÉÀÏ ¼³Á¤¹æ¹ý
  4.  ·ÎÄÉÀÏÀ» Áö¿øÇÏ´Â ÇÁ·Î±×·¥ÀÇ ½ÇÇà ¹æ½ÄÀ» ¼±ÅÃÇϱâ À§Çؼ­´Â ȯ°æ º¯¼ö ¼³Á¤À»
    ÀÌ¿ëÇÑ´Ù. (Ä«Å×°í¸® °¢°¢¿¡ ÇØ´çÇϴ ȯ°æº¯¼ö´Â Ä«Å×°í¸® À̸§°ú µ¿ÀÏÇÏ´Ù.)
    ·ÎÄÉÀÏ È¯°æ º¯¼ö¿¡ °üÇÑ Á¤º¸´Â localeÀ̶õ ¸í·ÉÀ¸·Î °£´ÜÈ÷ ¾òÀ» ¼ö ÀÖ´Ù.
    % locale
    LANG=ko_KR.eucKR
    LC_CTYPE="ko_KR.eucKR"
    LC_NUMERIC="ko_KR.eucKR"
    LC_TIME="ko_KR.eucKR"
    LC_COLLATE="ko_KR.eucKR"
    LC_MONETARY="ko_KR.eucKR"
    LC_MESSAGES="ko_KR.eucKR"
    LC_ALL=
     À§¿¡¼­ ko_KR.eucKRÀº ·ÎÄÉÀÏ °ª(locale name)ÀÌ´Ù. ÀϹÝÀûÀÎ ·ÎÄÉÀÏ °ªÀÇ Çü½ÄÀº
    ll[_CC[.EEEE]][@dddd] ÀÌ´Ù. llÀº ¾ð¾î(language)¸¦ ÁöÁ¤ÇÏ´Â ¼Ò¹®ÀÚ µÎ ±ÛÀÚ ISO
    639 language code, CC´Â Áö¿ª(territory)¸¦ ÁöÁ¤ÇÏ´Â ´ë¹®ÀÚ µÎ ±ÛÀÚ ISO 3166
    country code, EEEE´Â ÄÚµå¼Â(codeset)À» ÁöÁ¤ÇÏ´Â ¹®ÀÚ¼Â(character set) ¶Ç´Â
    ÀÎÄÚµù(encoding), dddd´Â ¹æ¾ð µîÀÇ º¯Á¾À» ±¸º°Çϱâ À§ÇÑ °Í(modifier)ÀÌ´Ù. []·Î
    Ç¥½ÃµÈ ³»¿ëÀº ¾È ¾µ¼öµµ ÀÖÀ½À» ÀǹÌÇÑ´Ù. ¿¹¸¦ µé¸é en_US´Â ¹Ì±¹ ¿µ¾î±Ç, en_CA´Â
    ¿µ¾î±Ç Ä«³ª´Ù, de_DE´Â µ¶ÀÏÀÇ µ¶ÀϾî, fr_FR´Â ÇÁ¶û½ºÀÇ ÇÁ¶û½º¾î¸¦ ÀǹÌÇÑ´Ù.
     ¾Æ¹« ·ÎÄÉÀϵµ ¼³Á¤ÇÏÁö ¾Ê¾ÒÀ» ¶§ glibc¿¡¼­ÀÇ ±âº» ·ÎÄÉÀÏÀº C ¶Ç´Â POSIX
    (glibc¿¡¼­´Â C ·ÎÄÉÀÏÀÇ alias) ·ÎÄÉÀÏÀÌ´Ù. 
    % locale -a
    ¶ó´Â ¸í·ÉÀ» ÀÌ¿ëÇϸé ÀÌ¿Ü¿¡ »ç¿ë °¡´ÉÇÑ ·ÎÄÉÀÏÀÇ À̸§µéÀ» ¾Ë ¼ö ÀÖ´Ù.
     ´ÙÀ½Àº ¿©·¯°¡Áö ȯ°æº¯¼öÀÇ ¿ªÇÒ(Ä«Å×°í¸®ÀÇ °æ¿ì¿¡´Â µ¿½Ã¿¡ Ä«Å×°í¸®ÀÇ ¿ªÇÒ)¿¡
    °üÇÑ ¼³¸íÀÌ´Ù.
    
      LANG : ¸ðµç Ä«Å×°í¸®¿¡ ´ëÇÑ ·ÎÄÉÀÏ ¼³Á¤À» À§ÇÑ È¯°æº¯¼öÀÌ´Ù. ÇÏÁö¸¸ LC_*
    ȯ°æº¯¼öº¸´Ù ¿ì¼± ¼øÀ§°¡ ³·´Ù. LC_ALLÀÌ ¼³Á¤ÀÌ ¾È µÇ¾î ÀÖ°í LC_* °ªµéÀÌ ¼³Á¤ÀÌ
    µû·Î ¼³Á¤ÀÌ ¾ÊµÈ °æ¿ì LANGÀ» º¯È­½ÃÅ°¸é LC_ALLÀ» Á¦¿ÜÇÑ ·ÎÄÉÀÏ Ä«Å×°í¸®µéÀÇ
    °ªÀÌ º¯°æµÇÁö¸¸ LC_ALLÀÌ ¼³Á¤ µÇ¾î ÀÖ´Â °æ¿ì LANGÀÇ º¯È­´Â ·ÎÄÉÀÏ Ä«Å×°í¸®µéÀÇ
    °ª¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê´Â´Ù.
      LC_CTYPE : ¹®ÀÚ ºÐ·ù(¾ËÆĺª, ¼ýÀÚ, ÇÑ±Û ¶Ç´Â ¼Ò¹®ÀÚ, ´ë¹®ÀÚ µîµî), º¯È¯,
    ´ë¼Ò¹®ÀÚ ºñ±³À» À§ÇÑ ·ÎÄÉÀÏ ¼³Á¤À» ÀǹÌÇÑ´Ù. ÀÌ°ÍÀº ¿¹¸¦ µé¾î fgetwc(), is*(),
    isw*(), mblen(), mbtowc(), wcstombs() µîÀÇ ÇÔ¼ö¿¡ ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Ù.
      LC_COLLATE : ½ºÆ®¸µ(string)ÀÇ Á¤·Ä ¼ø¼­(sort order ¶Ç´Â collation)¸¦ À§ÇÑ
    ·ÎÄÉÀÏ ¼³Á¤À» À§ÇØ »ç¿ëµÈ´Ù. ÀÌ°ÍÀº ¿¹¸¦ µé¾î strcoll(), wcscoll(), strxfrm()
    µîÀÇ ÇÔ¼ö¿¡ ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Ù.
      LC_MESSAGES : ¸Þ½ÃÁö Ç¥ÇöÀ» À§ÇÑ ·ÎÄÉÀÏ ¼³Á¤. ¸Þ½ÃÁöÀÇ ±¹Á¦È­¸¦ À§ÇÑ
    catopen(), gettext() µîÀÇ ÇÔ¼ö¿¡ ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Ù.
      LC_NUMERIC : ±Ý¾×ÀÌ ¾Æ´Ñ ¼ýÀÚ Ç¥Çö(õ´ÜÀ§, ¼Ò¼öÁ¡, ¼ýÀÚ ±×·ìÇÎ µî)À» À§ÇÑ
    ·ÎÄÉÀÏ ¼³Á¤. ¿¹¸¦ µé¾î strtod(), atof().
      LC_MONETARY : ±Ý¾× Ç¥Çö(õ´ÜÀ§ ±¸ºÐ ¹®ÀÚ, ¼Ò¼öÁ¡ ¹®ÀÚ, ±Ý¾× Ç¥½Ã ¹®ÀÚ, ±× 
    À§Ä¡ µî)À» À§ÇÑ ·ÎÄÉÀÏ ¼³Á¤. ¿¹¸¦ µé¾î strfmon().
      LC_TIME : ½Ã°£°ú ³¯Â¥ÀÇ Ç¥Çö(³â, ¿ù, ÀÏ¿¡ ´ëÇÑ ¸íĪ µî)À» À§ÇÑ ·ÎÄÉÀÏ ¼³Á¤
    ¿¹¸¦ µé¾î strftime(), strptime().
      LC_ALL : ¸ðµç Ä«Å×°í¸®¿¡ ´ëÇÑ ·ÎÄÉÀÏ ¼³Á¤À» À§ÇÑ È¯°æº¯¼öÀÌ´Ù. À§ÀÇ LC_* ¹×
    LANGÀÇ ¾î¶² °Íº¸´Ù ¿ì¼± ¼øÀ§°¡ ³ô´Ù. ±×¸®°í LC_ALLÀ» ¼³Á¤ÇÏ¸é ´Ù¸¥ ·ÎÄÉÀÏ
    Ä«Å×°í¸®ÀÇ °ªµéÀÌ LC_ALLÀÇ °ªÀÇ º¯°æµÇ°í LC_ALL¼³Á¤À» ¾ø¾Ö¸é ´Ù¸¥ ·ÎÄÉÀÏ
    Ä«Å×°í¸®ÀÇ °ªµéÀº ÀÌÀü°ªÀ» À¯ÁöÇÑ´Ù.
      LANGUAGE : ·ÎÄÉÀÏÀÇ ´ÙÁß ¼³Á¤À» À§ÇØ gettext¿¡¼­ »ç¿ëµÇ´Â GNU extension 
    ȯ°æº¯¼ö·Î LC_ALLº¸´Ùµµ ¿ì¼±¼øÀ§°¡ ³ô´Ù. ·ÎÄÉÀϵéÀº ±¸ºÐ¹®ÀÚ : À» ÀÌ¿ëÇÏ¿©
    ¿ì¼±¼øÀ§°¡ ³ôÀº ¼ø´ë·Î ³ª¿­µÈ´Ù. ¿¹¸¦ µé¾î LANGUAGE=en_US:ko_KR
      LINGUAS : gettext¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ ¼³Ä¡½Ã ÁöÁ¤ÇÑ ¾ð¾îµéÀÇ ¸Þ½ÃÁö¸¸À»
    ¼³Ä¡Çϱâ À§ÇÑ È¯°æº¯¼ö. ±¸ºÐ ¹®ÀÚ´Â ½ºÆäÀ̽ºÀÌ´Ù. ¿¹¸¦ µé¾î LINGUAS="ko ja"
    

  5. ·ÎÄÉÀÏÀ» Áö¿øÇϱâ À§ÇÑ ¹æ¹ý ¹× ÀÛµ¿ ¿ø¸®
  6.  ·ÎÄÉÀÏÀ» Á¦´ë·Î Áö¿øÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇϱâ À§Çؼ­´Â setlocale()ÇÔ¼ö¸¦
    ÀÌ¿ëÇÏ¿© ·ÎÄÉÀÏÀ» ¼³Á¤ÇÏ°í È®ÀÎÇÏ¿©¾ß ÇÑ´Ù. setlocale()ÇÔ¼ö´Â Çì´õ ÆÄÀÏ
    locale.h ¿¡ Á¤ÀǵǾî ÀÖÀ¸¸ç ±× ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù.
     char *setlocale (int category, const char *locale);
    ÀÌ ÇÔ¼öÀÇ ¿ªÇÒÀº Ä«Å×°í¸® category¿¡ ´ëÇØ ·ÎÄÉÀÏ localeÀ» ¼³Á¤ÇÏ°í (¹°·Ð, »ç¿ë
    °¡´ÉÇÑ ·ÎÄÉÀÏÀÎ °æ¿ì), ¼³Á¤µÈ ·ÎÄÉÀÏ°ªÀ» ¸®ÅÏÇÏ´Â °ÍÀÌ´Ù.
     locale ºÎºÐ¿¡ ""À» ³ÖÀº ´ÙÀ½°ú °°Àº ¿¹´Â
     setlocale (LC_ALL, "");
    Àû´çÇÑ È¯°æº¯¼ö¸¦ ÂüÁ¶ÇÏ¿© ·ÎÄÉÀÏÀ» ¼³Á¤ÇÏ°í ±× °ªÀ» ¸®ÅÏÇÑ´Ù. ȯ°æº¯¼ö¸¦
    ÂüÁ¶ÇÏ´Â ¿ì¼±¼øÀ§´Â À§¿¡¼­ ¼³¸íÇÑ´ë·Î LC_ALL, ±×¿Ü Ä«Å×°í¸®, LANGº¯¼ö ¼øÀÌ°í,
    º¯¼ö°ªÀ» ¾Ë¾Æ³»¸é locale.alias(¿¹¸¦ µé¾î, /usr/share/locale/)¸¦ ÂüÁ¶ÇÑ ÈÄ
    µÚ¿¡¼­ºÎÅÍ @ . _ À» ´ÜÀ§·Î ¼ø¼­´ë·Î Àß¶ó°¡¸ç »ç¿ë°¡´ÉÇÑ ·ÎÄÉÀÏÀ» ã¾Æ³½´Ù.
     Àμö locale ºÎºÐ¿¡ NULLÀ» ³ÖÀº ´ÙÀ½¿¹´Â 
     locale = setlocale (LC_ALL, NULL);
    ·ÎÄÉÀÏ °ªÀ» º¯°æ½ÃÅ°Áö ¾Ê°í ´ÜÁö Ä«Å×°í¸®¿¡ °üÇÑ ÇöÀç ·ÎÄÉÀÏ°ªÀ» ¾Ë¾Æ³»°íÀÚ 
    Çϱâ À§ÇØ ±× ¸®ÅÏ°ªÀ» »ç¿ëÇÏ´Â ¿¹ÀÌ´Ù.
     ´ÙÀ½Àº ÇÔ¼ö setlocale()À» »ç¿ëÇÏ¿© Àӽ÷Π·ÎÄÉÀÏ·Î º¯°æÇÏ´Â ¿¹ÀÌ´Ù. (glibc
    manual¿¡ ÀÖ´Â ¿¹)
    
         #include <stddef.h>
         #include <locale.h>
         #include <stdlib.h>
         #include <string.h>
         
         void
         with_other_locale (char *new_locale,
                            void (*subroutine) (int),
                            int argument)
         {
           char *old_locale, *saved_locale;
         
           /* ÇöÀç ·ÎÄÉÀϸíÀ» ¾Ë¾Æ³½´Ù. */
           old_locale = setlocale (LC_ALL, NULL);
         
           /* setlocale()ÀÇ ÀçÈ£Ãâ ÀÇÇØ º¯°æµÉ °ÍÀ» ´ëºñÇØ ·ÎÄÉÀÏ À̸§À» ¹Ì¸® º¹»çÇØ µÐ´Ù. */
           saved_locale = strdup (old_locale);
           if (saved_locale == NULL)
             fatal ("Out of memory");
         
           /* ·ÎÄÉÀÏÀ» º¯°æÇÏ°í subroutineÀ» ¼öÇàÇÑ´Ù. */
           setlocale (LC_ALL, new_locale);
           (*subroutine) (argument);
         
           /* ¿ø·¡ÀÇ ·ÎÄÉÀÏ·Î º¹±ÍÇÑ´Ù. */
           setlocale (LC_ALL, saved_locale);
           free (saved_locale);
         }
    
     ´ÙÀ½Àº ·ÎÄÉÀÏÀ» ÀÌ¿ëÇÏ¿© ³¯Â¥/½Ã°£À» Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥ÀÇ ¿¹ÀÌ´Ù.
    	#include <stdio.h>
    	#include <locale.h>
    	#include <time.h>
    
    	int main(void)
    	{
    		time_t now;
    		struct tm *l_time;
    		char string[256];
    
    		/* ȯ°æº¯¼ö·ÎºÎÅÍ ½Ã°£ °ü·Ã ·ÎÄÉÀÏÀ» °áÁ¤ÇÑ´Ù. */
    		setlocale(LC_TIME, "");
    
    		/* calendar ½Ã°£À» now¶ó´Â º¯¼ö¿¡ ÀúÀå. 
    		 * ±× °ªÀº 1970³â 1¿ù 1ÀÏ ÀÌÈĺÎÅÍ Áö±Ý±îÁöÀÇ ÃÊ´ÜÀ§ ½Ã°£ */
    		now = time((time_t *)NULL);
    
    		/* calendar ½Ã°£ÀÇ ´Ù¸¥ À¯¿ëÇÑ ÇüŸ¦ l_timeº¯¼ö¿¡ ÀúÀå */
    		l_time = localtime(&now);
    
    		/* ¿ì¸®°¡ ¿øÇÏ´Â Æ÷¸ËÀÇ ½Ã°£ Æ÷¸ËÀ» stringÀ̶ó´Â º¯¼ö¿¡ ÀúÀå */
    		strftime(string, sizeof string, "%c", l_time);
    
    		/* Ãâ·Â */
    	 	printf("%s\n", string);
    
    		return 0;
    	}
     ´ÙÀ½Àº À§ÀÇ ÆÄÀÏÀ» time_test.c¶ó°í ÀúÀåÇÏ°í ÄÄÆÄÀÏÇÏ¿© c½©¿¡¼­ ½ÃÇèÇÏ´Â 
    ¿¹ÀÌ´Ù.
    % gcc -o time_test time_test.c
    % setenv LANG ko_KR.eucKR
    % ./time_test
    2000³â 01¿ù 12ÀÏ ¼ö¿äÀÏ ¿ÀÈÄ 10½Ã 26ºÐ 56ÃÊ
    % setenv LANG C
    % ./time_test
    Wed Jan 12 22:27:22 2000
    


<ÁÖ ÆäÀÌÁö·Î> <ÇÑ´Ü°è À§·Î>
Copyright 2000.8 by HyunChul Kim

ÃÖ±Ù ¼öÁ¤ÀÏ: 12/08/00