Rust ISO3166国家代码库rust_iso3166的使用:高效处理国际标准国家/地区编码转换与查询

Rust ISO3166国家代码库rust_iso3166的使用:高效处理国际标准国家/地区编码转换与查询

什么是ISO 3166-1

ISO 3166-1是国际标准化组织(ISO)发布的ISO 3166标准的一部分,定义了国家、附属领土和特殊地理区域名称的代码。该标准定义了三种国家代码:

  • ISO 3166-1 alpha-2 - 两位字母国家代码,最广泛使用
  • ISO 3166-1 alpha-3 - 三位字母国家代码,比两位代码更能直观关联国家名称
  • ISO 3166-1 numeric - 三位数字国家代码

什么是ISO 3166-2

ISO 3166-2定义了ISO 3166-1中所有国家的主要行政区划(如省或州)的代码。每个完整的ISO 3166-2代码由两部分组成:

  • 第一部分是国家的ISO 3166-1 alpha-2代码
  • 第二部分最多三个字母数字字符

什么是ISO 3166-3

ISO 3166-3定义了自1974年首次发布以来已从ISO 3166-1中删除的国家名称的代码。每个前国家名称在ISO 3166-3中被分配一个四字母的字母代码。

安装

[dependencies]
rust_iso3166 = "0.1.4"

使用示例

// 通过不同编码格式查询国家信息
let country = rust_iso3166::from_alpha2("AU");
let country = rust_iso3166::from_alpha3("AUS");
let country = rust_iso3166::from_numeric(036);
let country = rust_iso3166::from_numeric_str("036");

// 打印所有国家信息
println!("{:?}", rust_iso3166::ALL);

// 打印不同编码格式的所有国家代码
println!("{:?}", rust_iso3166::ALL_ALPHA2);   // 所有alpha2代码
println!("{:?}", rust_iso3166::ALL_ALPHA3);   // 所有alpha3代码  
println!("{:?}", rust_iso3166::ALL_NAME);     // 所有国家名称
println!("{:?}", rust_iso3166::ALL_NUMERIC);  // 所有数字代码
println!("{:?}", rust_iso3166::ALL_NUMERIC_STR); // 所有数字代码(字符串格式)

// 打印不同编码格式的映射表
println!("{:?}", rust_iso3166::NUMERIC_MAP);  // 数字代码映射表
println!("{:?}", rust_iso3166::ALPHA3_MAP);   // alpha3代码映射表
println!("{:?}", rust_iso3166::ALPHA2_MAP);   // alpha2代码映射表

// ISO 3166-2行政区划查询
let country = rust_iso3166::from_alpha2("GB").unwrap();
let subdivisions = country.subdivisions();
assert!(subdivisions.unwrap().len() > 0);
let subdivision = rust_iso3166::iso3166_2::from_code("GB-EDH");
assert_eq!("Edinburgh, City of", subdivision.unwrap().name); 

// ISO 3166-3历史国家查询
let former_country = rust_iso3166::iso3166_3::from_code("PZPA");
assert_eq!("Panama Canal Zone", former_country.unwrap().name);

数据结构示例

// ISO 3166-1国家代码
CountryCode { 
    name: "Australia",
    alpha2: "AU", 
    alpha3: "AUS", 
    numeric: 36 
}

// ISO 3166-2行政区划
iso3166_2::Subdivision {
    name: "Bādghīs",
    code: "AF-BDG",
    subdivision_type: "Province",
    country_name: "Afghanistan",
    country_code: "AF",
    region_code: "AF-BDG",
}

// ISO 3166-3历史国家
iso3166_3::CountryCode3 {
    code: "BQAQ",
    name: "British Antarctic Territory",
    former: CountryCode { 
        name: "British Antarctic Territory",
        alpha2: "BQ", 
        alpha3: "ATB", 
        numeric: 0 
    },
    new_countries: [
        CountryCode { 
            name: "Antarctica",
            alpha2: "AQ", 
            alpha3: "ATA", 
            numeric: 010
        },    
    ],
    validity: [1974,1979],
    desc: "Merged into Antarctica",
}

完整使用示例

use rust_iso3166 as iso;

fn main() {
    // 通过不同编码方式查询中国信息
    let country_alpha2 = iso::from_alpha2("CN").unwrap();
    let country_alpha3 = iso::from_alpha3("CHN").unwrap();
    let country_numeric = iso::from_numeric(156).unwrap();
    let country_numeric_str = iso::from_numeric_str("156").unwrap();
    
    // 验证查询结果
    assert_eq!(country_alpha2.name, "China");
    assert_eq!(country_alpha3.name, "China");
    assert_eq!(country_numeric.name, "China");
    assert_eq!(country_numeric_str.name, "China");

    // 打印所有国家信息
    println!("所有国家列表: {:?}", iso::ALL);
    
    // 查询中国的行政区划信息
    let china = iso::from_alpha2("CN").unwrap();
    let subdivisions = china.subdivisions().unwrap();
    println!("中国行政区划数量: {}", subdivisions.len());
    
    // 查询北京行政区划详情
    let beijing = iso::iso3166_2::from_code("CN-BJ").unwrap();
    println!("北京市详情: {:?}", beijing);
    
    // 查询历史国家(前南斯拉夫)
    let former_country = iso::iso3166_3::from_code("CSXX").unwrap();
    println!("前国家: {:?}", former_country);
    assert_eq!(former_country.name, "Serbia and Montenegro");
    
    // 美国代码转换示例
    let country = iso::from_alpha2("US").unwrap();
    println!("美国alpha3代码: {}", country.alpha3);
    println!("美国数字代码: {}", country.numeric);
}

贡献和许可

欢迎提交Pull Request或创建Issue。该项目采用Apache-2.0许可证。


1 回复

Rust ISO3166国家代码库rust_iso3166使用指南

rust_iso3166是一个用于处理ISO 3166国际标准国家/地区编码的Rust库,它提供了高效的国家代码转换和查询功能。

主要特性

  • 支持ISO 3166-1 alpha-2(两字母代码)
  • 支持ISO 3166-1 alpha-3(三字母代码)
  • 支持ISO 3166-1 numeric(数字代码)
  • 国家/地区名称查询
  • 轻量级且无依赖

安装

在Cargo.toml中添加依赖:

[dependencies]
rust_iso3166 = "1.0"

基本使用方法

1. 通过国家代码查询国家信息

use rust_iso3166::Country;

fn main() {
    // 通过两字母代码查询
    let country = Country::from_alpha2("CN").unwrap();
    println!("中国: {:?}", country);
    
    // 通过三字母代码查询
    let country = Country::from_alpha3("USA").unwrap();
    println!("美国: {:?}", country);
    
    // 通过数字代码查询
    let country = Country::from_numeric(840).unwrap();
    println!("美国(数字代码): {:?}", country);
}

2. 获取所有国家列表

use rust_iso3166::COUNTRIES;

fn main() {
    for country in COUNTRIES.iter() {
        println!("{}: {} ({})", 
            country.name, 
            country.alpha2, 
            country.alpha3);
    }
}

3. 国家代码转换

use rust_iso3166::Country;

fn main() {
    let country = Country::from_alpha2("JP").unwrap();
    
    println!("三字母代码: {}", country.alpha3); // 输出: JPN
    println!("数字代码: {}", country.numeric);  // 输出: 392
}

4. 验证国家代码

use rust_iso3166::Country;

fn main() {
    assert!(Country::is_valid_alpha2("FR"));
    assert!(!Country::is_valid_alpha2("XX"));
    
    assert!(Country::is_valid_alpha3("DEU"));
    assert!(!Country::is_valid_alpha3("XYZ"));
}

高级用法

自定义国家信息结构

use rust_iso3166::Country;

#[derive(Debug)]
struct ExtendedCountryInfo {
    country: Country,
    population: u64,
    capital: String,
}

fn main() {
    let china = ExtendedCountryInfo {
        country: Country::from_alpha2("CN").unwrap(),
        population: 1_411_000_000,
        capital: "Beijing".to_string(),
    };
    
    println!("{:?}", china);
}

与serde集成(序列化/反序列化)

use rust_iso3166::Country;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct User {
    name: String,
    country: Country,
}

fn main() {
    let user = User {
        name: "Alice".to_string(),
        country: Country::from_alpha2("GB").unwrap(),
    };
    
    let json = serde_json::to_string(&user).unwrap();
    println!("{}", json); // 输出: {"name":"Alice","country":"GB"}
    
    let user: User = serde_json::from_str(&json).unwrap();
    println!("{}来自{}", user.name, user.country.name);
}

性能提示

rust_iso3166内部使用静态数组存储国家信息,所有查询操作都是O(1)时间复杂度,适合高性能场景使用。

错误处理

所有查询方法都返回Option<Country>,当查询失败时返回None

use rust_iso3166::Country;

fn main() {
    match Country::from_alpha2("XX") {
        Some(country) => println!("找到国家: {}", country.name),
        None => println!("无效的国家代码"),
    }
}

完整示例代码

// 完整示例展示rust_iso3166库的主要功能
use rust_iso3166::Country;
use serde::{Serialize, Deserialize};

fn main() {
    // 示例1: 基本查询功能
    println!("=== 基本查询功能 ===");
    let china = Country::from_alpha2("CN").unwrap();
    println!("中国: {} (Alpha2: {}, Alpha3: {}, 数字代码: {})", 
        china.name, china.alpha2, china.alpha3, china.numeric);

    // 示例2: 获取所有国家列表
    println!("\n=== 获取所有国家列表 ===");
    let total_countries = rust_iso3166::COUNTRIES.len();
    println!("总国家数量: {}", total_countries);

    // 示例3: 国家代码转换
    println!("\n=== 国家代码转换 ===");
    let japan = Country::from_alpha3("JPN").unwrap();
    println!("日本: Alpha2代码: {}", japan.alpha2);

    // 示例4: 验证国家代码
    println!("\n=== 验证国家代码 ===");
    println!("FR是有效的Alpha2代码吗? {}", Country::is_valid_alpha2("FR"));
    println!("XX是有效的Alpha2代码吗? {}", Country::is_valid_alpha2("XX"));

    // 示例5: 自定义国家信息结构
    println!("\n=== 自定义国家信息结构 ===");
    #[derive(Debug)]
    struct CountryDetails {
        country: Country,
        gdp: f64,  // 单位: 十亿美元
    }
    
    let usa_details = CountryDetails {
        country: Country::from_alpha2("US").unwrap(),
        gdp: 22996.1,
    };
    println!("美国经济详情: {:?}", usa_details);

    // 示例6: 与serde集成
    println!("\n=== 与serde集成 ===");
    #[derive(Serialize, Deserialize)]
    struct Business {
        name: String,
        headquarters: Country,
    }
    
    let company = Business {
        name: "TechCorp".to_string(),
        headquarters: Country::from_alpha2("DE").unwrap(),
    };
    
    let json = serde_json::to_string(&company).unwrap();
    println!("序列化结果: {}", json);
    
    // 示例7: 错误处理
    println!("\n=== 错误处理 ===");
    match Country::from_alpha2("ZZ") {
        Some(country) => println!("找到国家: {}", country.name),
        None => println!("无效的国家代码ZZ"),
    }
}

这个库是处理国际化应用时国家/地区代码的理想选择,特别是在需要验证或转换不同格式国家代码的场景下。

回到顶部