8个版本 (4个稳定版)
2.0.0 | 2023年2月27日 |
---|---|
2.0.0-beta.1 | 2023年2月21日 |
1.3.0 | 2023年2月21日 |
1.1.0 | 2021年3月14日 |
0.1.1 | 2020年8月16日 |
#398 in 编码
每月 680 次下载
用于 14 个 crate(4个直接使用)
67KB
791 行
OEM代码页Rust库
此库处理许多作为OEM代码页使用的SBCS(单字节字符集)。OEM代码页目前用于在Windows中编码ZIP存档中的文件名和在终端中的字符。
支持的代码页
代码页 | 注释 |
---|---|
437 | OEM美国 |
720 | 阿拉伯(透明ASMO);阿拉伯(DOS) |
737 | OEM希腊(以前为437G);希腊(DOS) |
775 | OEM波罗的海;波罗的海(DOS) |
850 | OEM多语言拉丁1;西欧(DOS) |
852 | OEM拉丁2;中欧(DOS) |
855 | OEM西里尔文(主要是俄语) |
857 | OEM土耳其;土耳其(DOS) |
858 | OEM多语言拉丁1 + 欧元符号 |
860 | OEM葡萄牙;葡萄牙(DOS) |
861 | OEM冰岛;冰岛(DOS) |
862 | OEM希伯来;希伯来(DOS) |
863 | OEM加拿大法语;加拿大法语(DOS) |
864 | OEM阿拉伯;阿拉伯(864) |
865 | OEM北欧;北欧(DOS) |
866 | OEM俄罗斯;西里尔文(DOS) |
869 | OEM现代希腊;希腊,现代(DOS) |
874 | ANSI/OEM泰语(ISO 8859-11);泰语(Windows) |
注释来自 https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers
如何使用
将 oem_cp
添加到项目中 Cargo.toml
的依赖项中。
[dependencies]
# *snip*
oem_cp = "2"
# *snip*
示例
使用特定代码页
将Unicode字符串编码为SBCS字节
use oem_cp::{encoding_string_checked, encoding_string_lossy};
use oem_cp::code_table::{ENCODING_TABLE_CP437, ENCODING_TABLE_CP737};
assert_eq!(encode_string_checked("π≈22/7", &*ENCODING_TABLE_CP437), Some(vec![0xE3, 0xF7, 0x32, 0x32, 0x2F, 0x37]));
// Archimedes in Greek
assert_eq!(encode_string_checked("Αρχιμήδης", &*ENCODING_TABLE_CP737), Some(vec![0x80, 0xA8, 0xAE, 0xA0, 0xA3, 0xE3, 0x9B, 0x9E, 0xAA]));
// ¾ (U+00BE) is not included in CP437
assert_eq!(encoding_string_checked("½+¼=¾", &*ENCODING_TABLE_CP437), None);
// Unknown characters can be replaced with ? (0x3F)
assert_eq!(encoding_string_lossy("½+¼=¾", &*ENCODING_TABLE_CP437), vec![0xAB, 0x2B, 0xAC, 0x3D, 0x3F]);
将SBCS字节解码为Unicode字符串
use oem_cp::{decode_string_complete_table, decode_string_incomplete_table_checked, decode_string_incomplete_table_lossy};
use oem_cp::code_table::{DECODING_TABLE_CP437, DECODING_TABLE_CP874};
assert_eq!(&decode_string_complete_table(vec![0xFB, 0xAC, 0x3D, 0xAB], &DECODING_TABLE_CP437), "√¼=½");
// For encoding that has some undefined code points, you must use decode_string_incomplete_table_{checked,lossy} instead of decode_string_complete_table
// means shrimp in Thai (U+E49 => 0xE9)
assert_eq!(decode_string_incomplete_table_checked(vec![0xA1, 0xD8, 0xE9, 0xA7], &DECODING_TABLE_CP874), Some("กุ้ง".to_string()));
// 0xDB-0xDE,0xFC-0xFF is undefined in CP874 in Windows
assert_eq!(decode_string_incomplete_table_checked(vec![0x30, 0xDB], &DECODING_TABLE_CP874), None);
// You can use decode_string_incomplete_table_lossy instead
assert_eq!(&decode_string_incomplete_table_lossy(vec![0xA1, 0xD8, 0xE9, 0xA7], &DECODING_TABLE_CP874), "กุ้ง");
// Undefined code points are replaced with U+FFFD (replacement character)
assert_eq!(&decode_string_incomplete_table_lossy(vec![0x30, 0xDB], &DECODING_TABLE_CP874), "0\u{FFFD}");
从整数选择适当的代码页
use oem_cp::code_table::{ENCODING_TABLE_CP_MAP, DECODING_TABLE_CP_MAP};
use oem_cp::{encoding_string_checked, encoding_string_lossy};
if let Some(cp874_table) = (*DECODING_TABLE_CP_MAP).get(&874) {
assert_eq!(cp874_table.decode_string_checked(vec![0xA1, 0xD8, 0xE9, 0xA7]), Some("กุ้ง".to_string()));
// undefined mapping 0xDB for CP874
assert_eq!(cp874_table.decode_string_checked(vec![0xDB]), None);
assert_eq!(&cp874_table.decode_string_lossy(vec![0xDB]), "\u{FFFD}");
} else {
panic!("Why the hell CP874 isn't registered?");
}
if let Some(cp437_table) = (*ENCODING_TABLE_CP_MAP).get(&437) {
assert_eq!(encode_string_checked("π≈22/7", cp437_table), Some(vec![0xE3, 0xF7, 0x32, 0x32, 0x2F, 0x37]));
// ¾ is undefined in CP437
assert_eq!(encoding_string_checked("½+¼=¾", cp437_table), None);
// It's replaced with ? (0x3F)
assert_eq!(encoding_string_lossy("½+¼=¾", cp437_table), vec![0xAB, 0x2B, 0xAC, 0x3D, 0x3F]);
} else {
panic!("Why the hell CP437 isn't registered?");
}
支持ANSI/EBCDIC/MBCS代码页
对于ANSI(125x)和MBCS(932-950;用于CJK语言)代码页,请使用 encoding_rs。
此库仅适用于扩展ASCII编码(0x00-0x80必须与ASCII兼容),因此不会支持EBCDIC编码。
0x01至0x19的符号
此库不支持从0x01到0x19映射的符号(CP437)。0x01-0x19映射到U+0001-U+0019。如果您需要符号,请使用 codepage_437。
许可证
MIT
依赖项
~97–275KB