1# 2# Locale::Country - ISO codes for country identification (ISO 3166) 3# 4# $Id: Country.pm,v 2.6 2002/07/10 16:33:27 neilb Exp $ 5# 6 7package Locale::Country; 8use strict; 9require 5.002; 10 11require Exporter; 12use Carp; 13use Locale::Constants; 14 15 16#----------------------------------------------------------------------- 17# Public Global Variables 18#----------------------------------------------------------------------- 19use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); 20$VERSION = sprintf("%d.%02d", q$Revision: 2.61 $ =~ /(\d+)\.(\d+)/); 21@ISA = qw(Exporter); 22@EXPORT = qw(code2country country2code 23 all_country_codes all_country_names 24 country_code2code 25 LOCALE_CODE_ALPHA_2 LOCALE_CODE_ALPHA_3 LOCALE_CODE_NUMERIC); 26 27#----------------------------------------------------------------------- 28# Private Global Variables 29#----------------------------------------------------------------------- 30my $CODES = []; 31my $COUNTRIES = []; 32 33 34#======================================================================= 35# 36# code2country ( CODE [, CODESET ] ) 37# 38#======================================================================= 39sub code2country 40{ 41 my $code = shift; 42 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT; 43 44 45 return undef unless defined $code; 46 47 #------------------------------------------------------------------- 48 # Make sure the code is in the right form before we use it 49 # to look up the corresponding country. 50 # We have to sprintf because the codes are given as 3-digits, 51 # with leading 0's. Eg 052 for Barbados. 52 #------------------------------------------------------------------- 53 if ($codeset == LOCALE_CODE_NUMERIC) 54 { 55 return undef if ($code =~ /\D/); 56 $code = sprintf("%.3d", $code); 57 } 58 else 59 { 60 $code = lc($code); 61 } 62 63 if (exists $CODES->[$codeset]->{$code}) 64 { 65 return $CODES->[$codeset]->{$code}; 66 } 67 else 68 { 69 #--------------------------------------------------------------- 70 # no such country code! 71 #--------------------------------------------------------------- 72 return undef; 73 } 74} 75 76 77#======================================================================= 78# 79# country2code ( NAME [, CODESET ] ) 80# 81#======================================================================= 82sub country2code 83{ 84 my $country = shift; 85 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT; 86 87 88 return undef unless defined $country; 89 $country = lc($country); 90 if (exists $COUNTRIES->[$codeset]->{$country}) 91 { 92 return $COUNTRIES->[$codeset]->{$country}; 93 } 94 else 95 { 96 #--------------------------------------------------------------- 97 # no such country! 98 #--------------------------------------------------------------- 99 return undef; 100 } 101} 102 103 104#======================================================================= 105# 106# country_code2code ( NAME [, CODESET ] ) 107# 108#======================================================================= 109sub country_code2code 110{ 111 (@_ == 3) or croak "country_code2code() takes 3 arguments!"; 112 113 my $code = shift; 114 my $inset = shift; 115 my $outset = shift; 116 my $outcode; 117 my $country; 118 119 120 return undef if $inset == $outset; 121 $country = code2country($code, $inset); 122 return undef if not defined $country; 123 $outcode = country2code($country, $outset); 124 return $outcode; 125} 126 127 128#======================================================================= 129# 130# all_country_codes ( [ CODESET ] ) 131# 132#======================================================================= 133sub all_country_codes 134{ 135 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT; 136 137 return keys %{ $CODES->[$codeset] }; 138} 139 140 141#======================================================================= 142# 143# all_country_names ( [ CODESET ] ) 144# 145#======================================================================= 146sub all_country_names 147{ 148 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT; 149 150 return values %{ $CODES->[$codeset] }; 151} 152 153 154#======================================================================= 155# 156# alias_code ( ALIAS => CODE [ , CODESET ] ) 157# 158# Add an alias for an existing code. If the CODESET isn't specified, 159# then we use the default (currently the alpha-2 codeset). 160# 161# Locale::Country::alias_code('uk' => 'gb'); 162# 163#======================================================================= 164sub alias_code 165{ 166 my $alias = shift; 167 my $real = shift; 168 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT; 169 170 my $country; 171 172 173 if (not exists $CODES->[$codeset]->{$real}) 174 { 175 carp "attempt to alias \"$alias\" to unknown country code \"$real\"\n"; 176 return undef; 177 } 178 $country = $CODES->[$codeset]->{$real}; 179 $CODES->[$codeset]->{$alias} = $country; 180 $COUNTRIES->[$codeset]->{"\L$country"} = $alias; 181 182 return $alias; 183} 184 185# old name of function for backwards compatibility 186*_alias_code = *alias_code; 187 188 189#======================================================================= 190# 191# rename_country 192# 193# change the official name for a country, eg: 194# gb => 'Great Britain' 195# rather than the standard 'United Kingdom'. The original is retained 196# as an alias, but the new name will be returned if you lookup the 197# name from code. 198# 199#======================================================================= 200sub rename_country 201{ 202 my $code = shift; 203 my $new_name = shift; 204 my $codeset = @_ > 0 ? shift : _code2codeset($code); 205 my $country; 206 my $c; 207 208 209 if (not defined $codeset) 210 { 211 carp "rename_country(): unknown country code \"$code\"\n"; 212 return 0; 213 } 214 215 $country = $CODES->[$codeset]->{$code}; 216 217 foreach my $cset (LOCALE_CODE_ALPHA_2, 218 LOCALE_CODE_ALPHA_3, 219 LOCALE_CODE_NUMERIC) 220 { 221 if ($cset == $codeset) 222 { 223 $c = $code; 224 } 225 else 226 { 227 $c = country_code2code($code, $codeset, $cset); 228 } 229 230 $CODES->[$cset]->{$c} = $new_name; 231 $COUNTRIES->[$cset]->{"\L$new_name"} = $c; 232 } 233 234 return 1; 235} 236 237 238#======================================================================= 239# 240# _code2codeset 241# 242# given a country code in an unknown codeset, return the codeset 243# it is from, or undef. 244# 245#======================================================================= 246sub _code2codeset 247{ 248 my $code = shift; 249 250 251 foreach my $codeset (LOCALE_CODE_ALPHA_2, LOCALE_CODE_ALPHA_3, 252 LOCALE_CODE_NUMERIC) 253 { 254 return $codeset if (exists $CODES->[$codeset]->{$code}) 255 } 256 257 return undef; 258} 259 260 261#======================================================================= 262# 263# initialisation code - stuff the DATA into the ALPHA2 hash 264# 265#======================================================================= 266{ 267 my ($alpha2, $alpha3, $numeric); 268 my ($country, @countries); 269 270 local $_; 271 272 while (<DATA>) 273 { 274 next unless /\S/; 275 chop; 276 ($alpha2, $alpha3, $numeric, @countries) = split(/:/, $_); 277 278 $CODES->[LOCALE_CODE_ALPHA_2]->{$alpha2} = $countries[0]; 279 foreach $country (@countries) 280 { 281 $COUNTRIES->[LOCALE_CODE_ALPHA_2]->{"\L$country"} = $alpha2; 282 } 283 284 if ($alpha3) 285 { 286 $CODES->[LOCALE_CODE_ALPHA_3]->{$alpha3} = $countries[0]; 287 foreach $country (@countries) 288 { 289 $COUNTRIES->[LOCALE_CODE_ALPHA_3]->{"\L$country"} = $alpha3; 290 } 291 } 292 293 if ($numeric) 294 { 295 $CODES->[LOCALE_CODE_NUMERIC]->{$numeric} = $countries[0]; 296 foreach $country (@countries) 297 { 298 $COUNTRIES->[LOCALE_CODE_NUMERIC]->{"\L$country"} = $numeric; 299 } 300 } 301 302 } 303 304 close(DATA); 305} 306 3071; 308 309__DATA__ 310ad:and:020:Andorra 311ae:are:784:United Arab Emirates 312af:afg:004:Afghanistan 313ag:atg:028:Antigua and Barbuda 314ai:aia:660:Anguilla 315al:alb:008:Albania 316am:arm:051:Armenia 317an:ant:530:Netherlands Antilles 318ao:ago:024:Angola 319aq:ata:010:Antarctica 320ar:arg:032:Argentina 321as:asm:016:American Samoa 322at:aut:040:Austria 323au:aus:036:Australia 324aw:abw:533:Aruba 325az:aze:031:Azerbaijan 326ba:bih:070:Bosnia and Herzegovina 327bb:brb:052:Barbados 328bd:bgd:050:Bangladesh 329be:bel:056:Belgium 330bf:bfa:854:Burkina Faso 331bg:bgr:100:Bulgaria 332bh:bhr:048:Bahrain 333bi:bdi:108:Burundi 334bj:ben:204:Benin 335bm:bmu:060:Bermuda 336bn:brn:096:Brunei Darussalam 337bo:bol:068:Bolivia 338br:bra:076:Brazil 339bs:bhs:044:Bahamas 340bt:btn:064:Bhutan 341bv:bvt:074:Bouvet Island 342bw:bwa:072:Botswana 343by:blr:112:Belarus 344bz:blz:084:Belize 345ca:can:124:Canada 346cc:cck:166:Cocos (Keeling) Islands 347cf:caf:140:Central African Republic 348cg:cog:178:Congo:Congo, Republic of the 349ch:che:756:Switzerland 350ci:civ:384:Cote D'Ivoire 351ck:cok:184:Cook Islands 352cl:chl:152:Chile 353cm:cmr:120:Cameroon 354cn:chn:156:China 355co:col:170:Colombia 356cr:cri:188:Costa Rica 357cu:cub:192:Cuba 358cv:cpv:132:Cape Verde 359cx:cxr:162:Christmas Island 360cy:cyp:196:Cyprus 361cz:cze:203:Czech Republic 362de:deu:276:Germany 363dj:dji:262:Djibouti 364dk:dnk:208:Denmark 365dm:dma:212:Dominica 366do:dom:214:Dominican Republic 367dz:dza:012:Algeria 368ec:ecu:218:Ecuador 369ee:est:233:Estonia 370eg:egy:818:Egypt 371eh:esh:732:Western Sahara 372er:eri:232:Eritrea 373es:esp:724:Spain 374et:eth:231:Ethiopia 375fi:fin:246:Finland 376fj:fji:242:Fiji 377fk:flk:238:Falkland Islands (Malvinas):Falkland Islands (Islas Malvinas) 378fm:fsm:583:Micronesia, Federated States of 379fo:fro:234:Faroe Islands 380fr:fra:250:France 381fx:fxx:249:France, Metropolitan 382ga:gab:266:Gabon 383gb:gbr:826:United Kingdom:Great Britain 384gd:grd:308:Grenada 385ge:geo:268:Georgia 386gf:guf:254:French Guiana 387gh:gha:288:Ghana 388gi:gib:292:Gibraltar 389gl:grl:304:Greenland 390gm:gmb:270:Gambia 391gn:gin:324:Guinea 392gp:glp:312:Guadeloupe 393gq:gnq:226:Equatorial Guinea 394gr:grc:300:Greece 395gs:sgs:239:South Georgia and the South Sandwich Islands 396gt:gtm:320:Guatemala 397gu:gum:316:Guam 398gw:gnb:624:Guinea-Bissau 399gy:guy:328:Guyana 400hk:hkg:344:Hong Kong 401hm:hmd:334:Heard Island and McDonald Islands 402hn:hnd:340:Honduras 403hr:hrv:191:Croatia 404ht:hti:332:Haiti 405hu:hun:348:Hungary 406id:idn:360:Indonesia 407ie:irl:372:Ireland 408il:isr:376:Israel 409in:ind:356:India 410io:iot:086:British Indian Ocean Territory 411iq:irq:368:Iraq 412ir:irn:364:Iran, Islamic Republic of:Iran 413is:isl:352:Iceland 414it:ita:380:Italy 415jm:jam:388:Jamaica 416jo:jor:400:Jordan 417jp:jpn:392:Japan 418ke:ken:404:Kenya 419kg:kgz:417:Kyrgyzstan 420kh:khm:116:Cambodia 421ki:kir:296:Kiribati 422km:com:174:Comoros 423kn:kna:659:Saint Kitts and Nevis 424kp:prk:408:Korea, Democratic People's Republic of:Korea, North:North Korea 425kr:kor:410:Korea, Republic of:Korea, South:South Korea 426kw:kwt:414:Kuwait 427ky:cym:136:Cayman Islands 428kz:kaz:398:Kazakhstan:Kazakstan 429la:lao:418:Lao People's Democratic Republic 430lb:lbn:422:Lebanon 431lc:lca:662:Saint Lucia 432li:lie:438:Liechtenstein 433lk:lka:144:Sri Lanka 434lr:lbr:430:Liberia 435ls:lso:426:Lesotho 436lt:ltu:440:Lithuania 437lu:lux:442:Luxembourg 438lv:lva:428:Latvia 439ly:lby:434:Libyan Arab Jamahiriya:Libya 440ma:mar:504:Morocco 441mc:mco:492:Monaco 442md:mda:498:Moldova, Republic of:Moldova 443mg:mdg:450:Madagascar 444mh:mhl:584:Marshall Islands 445mk:mkd:807:Macedonia, the Former Yugoslav Republic of:Macedonia, Former Yugoslav Republic of:Macedonia 446ml:mli:466:Mali 447mm:mmr:104:Myanmar 448mn:mng:496:Mongolia 449mo:mac:446:Macao:Macau 450mp:mnp:580:Northern Mariana Islands 451mq:mtq:474:Martinique 452mr:mrt:478:Mauritania 453ms:msr:500:Montserrat 454mt:mlt:470:Malta 455mu:mus:480:Mauritius 456mv:mdv:462:Maldives 457mw:mwi:454:Malawi 458mx:mex:484:Mexico 459my:mys:458:Malaysia 460mz:moz:508:Mozambique 461na:nam:516:Namibia 462nc:ncl:540:New Caledonia 463ne:ner:562:Niger 464nf:nfk:574:Norfolk Island 465ng:nga:566:Nigeria 466ni:nic:558:Nicaragua 467nl:nld:528:Netherlands 468no:nor:578:Norway 469np:npl:524:Nepal 470nr:nru:520:Nauru 471nu:niu:570:Niue 472nz:nzl:554:New Zealand 473om:omn:512:Oman 474pa:pan:591:Panama 475pe:per:604:Peru 476pf:pyf:258:French Polynesia 477pg:png:598:Papua New Guinea 478ph:phl:608:Philippines 479pk:pak:586:Pakistan 480pl:pol:616:Poland 481pm:spm:666:Saint Pierre and Miquelon 482pn:pcn:612:Pitcairn:Pitcairn Island 483pr:pri:630:Puerto Rico 484ps:pse:275:Palestinian Territory, Occupied 485pt:prt:620:Portugal 486pw:plw:585:Palau 487py:pry:600:Paraguay 488qa:qat:634:Qatar 489re:reu:638:Reunion 490ro:rom:642:Romania 491ru:rus:643:Russian Federation:Russia 492rw:rwa:646:Rwanda 493sa:sau:682:Saudi Arabia 494sb:slb:090:Solomon Islands 495sc:syc:690:Seychelles 496sd:sdn:736:Sudan 497se:swe:752:Sweden 498sg:sgp:702:Singapore 499sh:shn:654:Saint Helena 500si:svn:705:Slovenia 501sj:sjm:744:Svalbard and Jan Mayen:Jan Mayen:Svalbard 502sk:svk:703:Slovakia 503sl:sle:694:Sierra Leone 504sm:smr:674:San Marino 505sn:sen:686:Senegal 506so:som:706:Somalia 507sr:sur:740:Suriname 508st:stp:678:Sao Tome and Principe 509sv:slv:222:El Salvador 510sy:syr:760:Syrian Arab Republic:Syria 511sz:swz:748:Swaziland 512tc:tca:796:Turks and Caicos Islands 513td:tcd:148:Chad 514tf:atf:260:French Southern Territories 515tg:tgo:768:Togo 516th:tha:764:Thailand 517tj:tjk:762:Tajikistan 518tk:tkl:772:Tokelau 519tm:tkm:795:Turkmenistan 520tn:tun:788:Tunisia 521to:ton:776:Tonga 522tl:tls:626:East Timor 523tr:tur:792:Turkey 524tt:tto:780:Trinidad and Tobago 525tv:tuv:798:Tuvalu 526tw:twn:158:Taiwan, Province of China:Taiwan 527tz:tza:834:Tanzania, United Republic of:Tanzania 528ua:ukr:804:Ukraine 529ug:uga:800:Uganda 530um:umi:581:United States Minor Outlying Islands 531us:usa:840:United States:USA:United States of America 532uy:ury:858:Uruguay 533uz:uzb:860:Uzbekistan 534va:vat:336:Holy See (Vatican City State):Holy See (Vatican City) 535vc:vct:670:Saint Vincent and the Grenadines 536ve:ven:862:Venezuela 537vg:vgb:092:Virgin Islands, British:British Virgin Islands 538vi:vir:850:Virgin Islands, U.S. 539vn:vnm:704:Vietnam 540vu:vut:548:Vanuatu 541wf:wlf:876:Wallis and Futuna 542ws:wsm:882:Samoa 543ye:yem:887:Yemen 544yt:myt:175:Mayotte 545yu:yug:891:Yugoslavia 546za:zaf:710:South Africa 547zm:zmb:894:Zambia 548zr:zar:180:Zaire:Congo, The Democratic Republic of the:Congo, Democratic Republic of the 549zw:zwe:716:Zimbabwe 550