#字符集 #字符编码 #OEM #字符集 #页面 #字节

无std oem_cp

Rust库,用于处理单字节字符集的OEM代码页(例如CP{437,737,850})

8个版本 (4个稳定版)

2.0.0 2023年2月27日
2.0.0-beta.12023年2月21日
1.3.0 2023年2月21日
1.1.0 2021年3月14日
0.1.1 2020年8月16日

#398 in 编码

Download history 221/week @ 2024-03-13 161/week @ 2024-03-20 105/week @ 2024-03-27 85/week @ 2024-04-03 142/week @ 2024-04-10 116/week @ 2024-04-17 155/week @ 2024-04-24 70/week @ 2024-05-01 73/week @ 2024-05-08 192/week @ 2024-05-15 144/week @ 2024-05-22 133/week @ 2024-05-29 112/week @ 2024-06-05 137/week @ 2024-06-12 227/week @ 2024-06-19 192/week @ 2024-06-26

每月 680 次下载
用于 14 crate(4个直接使用)

MIT 许可证

67KB
791

OEM代码页Rust库

CI (master) CI (Release) oem_cp at crates.io oem_cp at docs.rs

此库处理许多作为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