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"),
}
}
这个库是处理国际化应用时国家/地区代码的理想选择,特别是在需要验证或转换不同格式国家代码的场景下。