这是 perlebcdic 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
perlebcdic - 在 EBCDIC 平台上运行 Perl 的注意事项
商品描述
探讨 Perl 程序员在基于 EBCDIC 的计算机上面临的一些问题。
本文档中尚不完整的部分标有 XXX。
早期的 Perl 版本可以在一些 EBCDIC 机器上运行,但最后一个已知版本在
EBCDIC 是 v5.8.7,直到 v5.22,Perl 核心再次在 z/OS 上运行。 理论上,它
可以在 OS/400 或 Siemens 的 BS2000(或它们的后继者)上工作,但这是未经测试的。 在
v5.22,并非所有在 CPAN 上找到但与核心 Perl 一起在 z/OS 上运行的模块。
如果您想在非 z/OS EBCDIC 机器上使用 Perl,请通过发送邮件告诉我们
至 [email protected]
在 EBCDIC 平台上编写 Perl 真的与在“ASCII”平台上编写没有什么不同,
但是我们很快就会看到不同的潜在数字。 你必须知道
关于那些“ASCII”平台的一些东西,因为文档是有偏见的,并且会
经常使用不适用于 EBCDIC 的示例数字。 CPAN也很少
为 EBCDIC 编写且不适用于 ASCII 的模块; 取而代之的是广大
大多数 CPAN 模块是为 ASCII 编写的,有些可能碰巧适用于 EBCDIC,
而一些被设计为可移植地在两者上工作。
如果您的代码仅使用 52 个字母 AZ 和 az,加上空格、数字 0-9 和
Perl 使用的标点符号,加上一些用转义表示的控件
像 "\n" 和 "\t" 这样的序列,那么使用 Perl 没有什么特别的,你的代码
无需更改即可在 ASCII 机器上很好地工作。
但是,如果您编写的代码使用“\005”表示制表符或“\xC1”表示“A”或“\xDF”
表示“ye”(带有分音符的小“y”),那么您的代码很可能适用于您的 EBCDIC
平台,但不是在 ASCII 平台上。 如果没有人想要运行你的
ASCII 平台上的代码; 但本文档的偏向在于编写可移植的代码
EBCDIC 和 ASCII 系统之间。 再说一遍,如果你关心的每个角色都很容易
可以从键盘输入,您不必了解有关 ASCII 的任何信息,但是很多
键盘不容易让你直接输入,比如字符“\xDF”,所以你有
间接指定它,例如使用“\xDF”转义序列。 在这些情况下
了解 ASCII/Unicode 字符集是最容易的。 如果你知道
小“ye”是“U+00FF”,那么你可以改为将它指定为“\N{U+FF}”,并有
计算机自动将其转换为您平台上的“\xDF”,并在上将其保留为“\xFF”
ASCII 的。 或者您可以按名称指定它,“\N{LATIN SMALL LETTER Y WITH DIAERESIS”和
不必知道数字。 无论哪种方式都可以,但需要熟悉 Unicode。
COMMON 字符 守则 集合
ASCII码
美国信息交换标准代码(ASCII 或 US-ASCII)是一组
从 0 到 127(十进制)的整数,它们具有标准化的解释
使用 ASCII 的计算机。 例如,65 表示字母“A”。 范围 0..127 可以是
通过将位设置为 7 位二进制数字来覆盖,因此该集合有时被称为
为“7 位 ASCII”。 ASCII 由美国国家标准协会描述
文件 ANSI X3.4-1986。 ISO 646:1991 也对它进行了描述(对
货币符号)。 下表给出了完整的 ASCII 集作为前 128
元素。 可以用 ASCII 字符充分书写的语言包括
英语、夏威夷语、印度尼西亚语、斯瓦希里语和一些美洲原住民语言。
大多数非 EBCDIC 字符集是 ASCII 的超集。 那是整数 0-127 的意思
什么 ASCII 说他们的意思。 但是整数 128 及以上是特定于字符集的。
其中许多完全适合 8 位,使用 ASCII 作为 0-127,同时指定什么
128-255 表示,并且不使用 255 以上的任何内容。因此,这些是单字节(或八位字节,如果
你更喜欢)字符集。 一个重要的(因为 Unicode 是它的超集)是
ISO 8859-1 字符集。
ISO 8859
ISO 8859-$n 是来自国际的字符代码集的集合
标准化组织 (ISO),每个组织都向 ASCII 集添加字符
通常在各种语言中都可以找到,其中许多是基于罗马的,或者
拉丁文,字母表。 大多数是欧洲语言,但也有阿拉伯语,
希腊语、希伯来语和泰语。 网络上有关于所有这些的很好的参考。
拉丁语 1 (国际标准化组织 8859-1)
ASCII 的特殊 8 位扩展,包括重音和重音拉丁语
人物。 可以采用 ISO 8859-1 的语言包括
ASCII 以及南非荷兰语、阿尔巴尼亚语、巴斯克语、加泰罗尼亚语、丹麦语、法罗语、芬兰语、
挪威语、葡萄牙语、西班牙语和瑞典语。 尽管没有 ij,但仍涵盖荷兰语
结扎。 法语也包括在内,但没有 oe 连字。 德国人可以使用 ISO 8859-1
但必须在没有德式引号的情况下这样做。 这一套是基于西方的
ASCII 的欧洲扩展,在万维网工作中很常见。 在 IBM
字符代码集标识术语,ISO 8859-1 也称为 CCSID 819(或
有时是 0819 甚至 00819)。
EBCDIC
扩展二进制编码十进制交换码是指大量单
和与 ASCII 和 ISO 8859-1 完全不同的多字节编码字符集,
并且都略有不同; 它们通常在主机上运行。 这
EBCDIC 编码源自 Hollerith 穿孔卡片编码的 8 位字节扩展,
早于 ASCII。 卡片上的布局使得高位被设置为
大写和小写字母字符“[az]”和“[AZ]”,但有间隙
在每个拉丁字母范围内,见下表。 这些差距会导致
并发症。
某些 IBM EBCDIC 字符集可能通过字符代码集标识号获知
(CCSID 号)或代码页号。
Perl 可以在运行三种常用 EBCDIC 字符中的任何一种的平台上编译
集,如下所列。
这个 13 变种 字符
在 IBM EBCDIC 字符代码集中,有 13 个字符经常映射到
不同的整数值。 这些字符被称为 13 个“变体”字符和
是:
\ [ ] { } ^ ~ ! # | $@`
当 Perl 为一个平台编译时,它会查看所有这些字符来猜测哪个
平台使用的 EBCDIC 字符集,并相应地适应该平台。
如果平台使用的字符集不是 Perl 所知道的三个字符集之一,Perl
要么编译失败,要么错误地默默地选择三个中的一个。
EBCDIC 码 套 确认 by Perl的
0037
字符代码集 ID 0037 是 ASCII 加 Latin-1 字符(即 ISO
8859-1) 到 EBCDIC 集。 0037 用于北美英语语言环境
在 AS/400 计算机上运行的 OS/400 操作系统。 CCSID 0037 不同于 ISO
8859-1 在 236 个地方; 换句话说,他们只同意 20 个代码点值。
1047
字符代码集ID 1047也是ASCII加Latin-1字符的映射
(即 ISO 8859-1)到 EBCDIC 集。 1047 在 Unix 系统服务下用于
OS/390 或 z/OS,以及适用于 VM/ESA 的 OpenEdition。 CCSID 1047 与 CCSID 0037 的不同之处在于
八个位置,来自 ISO 8859-1 中的 236。
POSIX-BC
西门子 BS2000 系统上使用的 EBCDIC 代码页不同于 1047 和 0037。
下面将其标识为 POSIX-BC 集。 和0037、1047一样,和ISO一样
8859-1 在 20 个代码点值中。
统一 码 点 而不是 EBCDIC 码 点
在 Unicode 术语中 码 点 是分配给字符的编号:例如,在
EBCDIC 字符“A”通常被分配数字 193。在 Unicode 中,字符
“A”被分配了数字 65。 ASCII 和 Latin-1 (ISO 8859-1) 中的所有代码点都有
Unicode 中的含义相同。 所有三个公认的 EBCDIC 代码集都有 256 个代码
点,并且在每个代码集中,所有 256 个代码点都映射到等效的 Latin1 代码
点。 显然,“A”将映射到“A”、“B”=>“B”、“%”=>“%”等,对于所有可打印
Latin1 中的字符和这些代码页。
事实证明,EBCDIC 与 ASCII/Latin1 C0 几乎精确等效
控件和 DELETE 控件。 (C0 控件是那些 ASCII 代码点为
0..0x1F; TAB、ACK、BEL 等)在这些 ASCII/EBCDIC 之间建立映射
控件。 ASCII 平台上的 C1 控件之间没有如此精确的映射
和其余的 EBCDIC 控制。 所做的就是映射这些控件,主要是
任意地,到另一个字符集中的一些其他不匹配的字符。 大多数
无论如何,这些现在在 EBCDIC 中很少使用,它们的名字已经被
放下了,没有太多抱怨。 例如EO(八一)EBCDIC控制
(由 0 个 1 位 = 0xFF 组成)映射到 C9 APC 控制(XNUMXxXNUMXF),并且您
不能使用名称“EO”。
EBCDIC 控件提供三种可能的行终止符,CR (0x0D)、LF
(0x25) 和 NL (0x15)。 在 ASCII 平台上,符号“NL”和“LF”指代相同的
字符,但在严格的 EBCDIC 术语中,它们是不同的。 EBCDIC NL 是
映射到名为“NEL”(“下一行”;这是映射使
相当有道理,因此不仅仅是任意的)。 在某些 EBCDIC 平台上,此 NL
或 NEL 是典型的线路终结器。 z/OS 和 BS2000 也是如此。 在这些
平台,C 编译器将交换 LF 和 NEL 代码点,因此“\n”是 0x15,并且
指 NL。 Perl 也这样做; 您可以在下面的代码图表中看到它。 这使得
事情通常“正常工作”,您甚至不必知道有交换。
统一 和 联合会
UTF 代表“Unicode 转换格式”。 UTF-8 是将 Unicode 编码为
基于 ASCII 和 Latin-8 的 1 位字节块序列。 序列的长度
表示 Unicode 代码点所需的数量取决于该代码的序号
点,更大的数字需要更多的字节。 UTF-EBCDIC 类似于 UTF-8,但基于
EBCDIC。 它们经常很相似,随意的用法会将这两个术语混为一谈,并且
使用“UTF-8”表示在 ASCII 平台上找到的 UTF-8,以及在 ASCII 平台上找到的 UTF-EBCDIC
EBCDIC 的。
您可能会看到术语“不变”字符或代码点。 这仅仅意味着
当以 UTF-8(或 UTF-
EBCDIC) 就像没有一样。 (请注意,这是与“13 变体”完全不同的概念
字符”。细心的散文将使用术语“UTF-8 不变”而不是
只是“不变”,但大多数情况下,您只会看到“不变”。)例如,序数
“A”的值在大多数 EBCDIC 代码页中为 193,在以 UTF-EBCDIC 编码时也是 193。
所有 UTF-8(或 UTF-EBCDIC)变体代码点在编码时至少占用两个字节
UTF-8(或 UTF-EBCDIC); 根据定义,UTF-8(或 UTF-EBCDIC)不变代码点是
无论是否以 UTF-8(或 UTF-EBCDIC)编码,恰好是一个字节。 (现在你明白为什么
人们通常只说“UTF-8”,同时也表示“UTF-EBCDIC”。 剩下的
文档,我们也将对其随意处理。)在 ASCII UTF-8 中,代码点
对应于最低的 128 个序数(0 - 127:ASCII 字符)是
不变的。 在 UTF-EBCDIC 中,有 160 个不变字符。 (如果您关心,EBCDIC
不变量是那些具有 ASCII 等价物的字符,加上那些对应的
到 C1 控件(在 ASCII 平台上为 128 - 159)。)
以 UTF-EBCDIC 编码的字符串可能比以 UTF-EBCDIC 编码的字符串长(但绝不会短)
UTF-8。 Perl 扩展了 UTF-8,以便它可以编码高于 Unicode 最大值的代码点
U+10FFFF。 它也扩展了 UTF-EBCDIC,但由于 UTF-
EBCDIC,可表达的最大码点为U+7FFF_FFFF,即使字长更大
超过 32 位。
UTF-EBCDIC 由 Unicode 技术报告 #16 定义
<http://www.unicode.org/reports/tr16>. 它是基于 CCSID 1047 定义的,不允许
对于其他代码页的差异。 这允许轻松交换文本
在运行不同代码页的计算机之间,但使其无法使用,未经调整,
对于那些其他代码页上的 Perl。
这种不可用的原因是 Perl 的一个基本假设是
它关心的解析和词法分析的字符是否相同
文本是 UTF-8。 例如,Perl 期望字符“[”具有相同的
表示,无论包含它的字符串(或程序文本)是否为 UTF-8 编码
或不。 为确保这一点,Perl 使 UTF-EBCDIC 适应特定的代码页,以便所有
它期望是 UTF-8 不变的字符实际上是 UTF-8 不变的。 这意味着
必须翻译在运行 Perl 的 UTF-EBCDIC 版本的计算机上生成的文本
以便运行另一台计算机的计算机可以理解。
运用 编码
从 Perl 5.8 开始,您可以使用标准模块 Encode 从 EBCDIC 转换为
Latin-1 代码点。 Encode 知道的 EBCDIC 字符集比 Perl 多
目前被编译运行。
使用编码“from_to”;
我的 %ebcdic = ( 176 => 'cp37', 95 => 'cp1047', 106 => 'posix-bc');
# $a 在 EBCDIC 代码点中
from_to($a, $ebcdic{ord '^'}, 'latin1');
# $a 是 ISO 8859-1 代码点
和从 Latin-1 代码点到 EBCDIC 代码点
使用编码“from_to”;
我的 %ebcdic = ( 176 => 'cp37', 95 => 'cp1047', 106 => 'posix-bc');
# $a 是 ISO 8859-1 代码点
from_to($a, 'latin1', $ebcdic{ord '^'});
# $a 在 EBCDIC 代码点中
对于 I/O,建议您使用 PerlIO 的自动翻译功能,请参阅
简介
从 5.8 版开始,Perl 使用 PerlIO I/O 库。 这使您可以使用不同的
每个 IO 通道的编码。 例如,您可以使用
使用编码;
open($f, ">:encoding(ascii)", "test.ascii");
打印 $f "Hello World!\n";
open($f, ">:encoding(cp37)", "test.ebcdic");
打印 $f "Hello World!\n";
open($f, ">:encoding(latin1)", "test.latin1");
打印 $f "Hello World!\n";
open($f, ">:encoding(utf8)", "test.utf8");
打印 $f "Hello World!\n";
以 ASCII、CP 0037 EBCDIC、ISO 8859-1 格式获取包含“Hello World!\n”的四个文件
(Latin-1)(在这个例子中与 ASCII 相同,因为只打印了 ASCII 字符),
和 UTF-EBCDIC(在本例中与普通 EBCDIC 相同,因为只有字符
EBCDIC 和 UTF-EBCDIC 之间没有区别)。 参见文档
编码::PerlIO 了解详情。
由于 PerlIO 层在内部使用原始 IO(字节),所有这些都完全忽略了诸如
文件系统的类型(ASCII 或 EBCDIC)。
单盒 OCTET TABLES
下表列出了 ASCII 和 Latin 1 有序集,包括子集:C0
控件 (0..31)、ASCII 图形 (32..7e)、删除 (7f)、C1 控件 (80..9f) 和 Latin-1
(又名 ISO 8859-1)(a0..ff)。 在 ASCII 的拉丁语 1 扩展的表名中有
被标记了大致对应的角色名称 这个 统一 标准, 版本
6.1 尽管在所有情况下都有诸如“s/LATIN//”和“s/VLGAR//”之类的替换;
“s/大写字母//”在某些情况下; 和“s/SMALL LETTER ([AZ])/\l$1/”在其他一些
案件。 控件使用其 Unicode 6.2 缩写列出。 差异
0037 和 1047 之间的集合标有“**”。 1047之间的区别
和 POSIX-BC 集用“##”标记。 列出的所有“ord()”数字都是十进制的。 如果你
宁愿看到此表列出八进制值,然后运行该表(即 pod
本文档的源文本,因为此配方可能不适用于 pod2_other_format
翻译)通过:
食谱 0
perl -ne 'if(/(.{29})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)' \
-e '{printf("%s%-5.03o%-5.03o%-5.03o%.03o\n",$1,$2,$3,$4,$5)}' \
Perlebcdic.pod
如果您想保留 UTF-x 代码点,那么您可能需要以脚本形式编写:
食谱 1
打开(FH,“
尽管 ( ){
如果 (/(.{29})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\.?(\d*)
\s+(\d+)\.?(\d*)/x)
{
如果 ($7 ne '' && $9 ne '') {
printf(
"%s%-5.03o%-5.03o%-5.03o%-5.03o%-3o.%-5o%-3o.%.03o\n",
$1,$2,$3,$4,$5,$6,$7,$8,$9);
}
elsif ($7 ne '') {
printf("%s%-5.03o%-5.03o%-5.03o%-5.03o%-3o.%-5o%.03o\n",
$1,$2,$3,$4,$5,$6,$7,$8);
}
其他{
printf("%s%-5.03o%-5.03o%-5.03o%-5.03o%-5.03o%.03o\n",
$1,$2,$3,$4,$5,$6,$8);
}
}
}
如果您希望看到此表列出十六进制值,请通过以下方式运行该表:
食谱 2
perl -ne 'if(/(.{29})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)' \
-e '{printf("%s%-5.02X%-5.02X%-5.02X%.02X\n",$1,$2,$3,$4,$5)}' \
Perlebcdic.pod
或者,为了保留十六进制的 UTF-x 代码点:
食谱 3
打开(FH,“
尽管 ( ){
如果 (/(.{29})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\.?(\d*)
\s+(\d+)\.?(\d*)/x)
{
如果 ($7 ne '' && $9 ne '') {
printf(
"%s%-5.02X%-5.02X%-5.02X%-5.02X%-2X.%-6.02X%02X.%02X\n",
$1,$2,$3,$4,$5,$6,$7,$8,$9);
}
elsif ($7 ne '') {
printf("%s%-5.02X%-5.02X%-5.02X%-5.02X%-2X.%-6.02X%02X\n",
$1,$2,$3,$4,$5,$6,$7,$8);
}
其他{
printf("%s%-5.02X%-5.02X%-5.02X%-5.02X%-5.02X%02X\n",
$1,$2,$3,$4,$5,$6,$8);
}
}
}
ISO
8859-1 POS-CCSID
CCSID CCSID CCSID IX-1047
字符 0819 0037 1047 BC UTF-8 UTF-EBCDIC
-------------------------------------------------- -------------------
0 0 0 0 0 0
1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3 3 3
4 55 55 55 4 55
5 45 45 45 5 45
6 46 46 46 6 46
7 47 47 47 7 47
8 22 22 22 8 22
9 5 5 5 9 5
10 37 21 21 10 21 **
11 11 11 11 11 11
12 12 12 12 12 12
13 13 13 13 13 13
14 14 14 14 14 14
15 15 15 15 15 15
16 16 16 16 16 16
1 17 17 17 17 17
2 18 18 18 18 18
3 19 19 19 19 19
4 20 60 60 60 20
21 61 61 61 21 61
22 50 50 50 22 50
23 38 38 38 23 38
24 24 24 24 24 24
25 25 25 25 25 25
26 63 63 63 26 63
27 39 39 39 27 39
28 28 28 28 28 28
29 29 29 29 29 29
30 30 30 30 30 30
31 31 31 31 31 31
32 64 64 64 32 64
! 33 90 90 90 33 90
" 34 127 127 127 34 127
# 35 123 123 123 35 123
$ 36 91 91 91 36 91
% 37 108 108 108 37 108
& 38 80 80 80 38 80
' 39 125 125 125 39 125
( 40 77 77 77 40 77
) 41 93 93 93 41 93
* 42 92 92 92 42 92
+ 43 78 78 78 43 78
, 44 107 107 107 44 107
- 45 96 96 96 45 96
。 46 75 75 75 46 75
/ 47 97 97 97 47 97
0 48 240 240 240 48 240
1 49 241 241 241 49 241
2 50 242 242 242 50 242
3 51 243 243 243 51 243
4 52 244 244 244 52 244
5 53 245 245 245 53 245
6 54 246 246 246 54 246
7 55 247 247 247 55 247
8 56 248 248 248 56 248
9 57 249 249 249 57 249
: 58 122 122 122 58 122
; 59 94 94 94 59 94
< 60 76 76 76 60 76
= 61 126 126 126 61 126
> 62 110 110 110 62 110
? 63 111 111 111 63 111
@ 64 124 124 124 64 124
65 193 193 193 65 193
乙 66 194 194 194 66 194
中 67 195 195 195 67 195
68 196 196 196 68 196
69 197 197 197 69 197
女 70 198 198 198 70 198
总人数 71 199 199 199 71 199
高 72 200 200 200 72 200
我 73 201 201 201 73 201
Ĵ 74 209 209 209 74 209
75 210 210 210 75 210
大号 76 211 211 211 76 211
男 77 212 212 212 77 212
否 78 213 213 213 78 213
Ø 79 214 214 214 79 214
80 215 215 215 80 215
问 81 216 216 216 81 216
82 217 217 217 82 217
小号 83 226 226 226 83 226
电话 84 227 227 227 84 227
85 228 228 228 85 228
五 86 229 229 229 86 229
宽 87 230 230 230 87 230
88 231 231 231 88 231
是 89 232 232 232 89 232
90 233 233 233 90 233
[ 91 186 173 187 91 173 ** ##
\ 92 224 224 188 92 224 ##
] 93 187 189 189 93 189 **
^ 94 176 95 106 94 95 ** ##
_ 95 109 109 109 95 109
` 96 121 121 74 96 121 ##
97 129 129 129 97 129
98 130 130 130 98 130
99 131 131 131 99 131
100 132 132 132 100 132
101 133 133 133 101 133
102 134 134 134 102 134
克 103 135 135 135 103 135
小时 104 136 136 136 104 136
我 105 137 137 137 105 137
Ĵ 106 145 145 145 106 145
107 146 146 146 107 146
升 108 147 147 147 108 147
米 109 148 148 148 109 148
110 149 149 149 110 149
Ø 111 150 150 150 111 150
112 151 151 151 112 151
113 152 152 152 113 152
114 153 153 153 114 153
115 162 162 162 115 162
116 163 163 163 116 163
117 164 164 164 117 164
118 165 165 165 118 165
119 166 166 166 119 166
× 120 167 167 167 120 167
是 121 168 168 168 121 168
122 169 169 169 122 169
{ 123 192 192 251 123 192 ##
| 124 79 79 79 124 79
} 125 208 208 253 125 208 ##
~ 126 161 161 255 126 161 ##
127 7 7 7 127 7
128 32 32 32 194.128 32
129 33 33 33 194.129 33
130 34 34 34 194.130 34
131 35 35 35 194.131 35
132 36 36 36 194.132 36
133 21 37 37 194.133 37 **
134 6 6 6 194.134 6
135 23 23 23 194.135 23
136 40 40 40 194.136 40
137 41 41 41 194.137 41
138 42 42 42 194.138 42
139 43 43 43 194.139 43
140 44 44 44 194.140 44
141 9 9 9 194.141 9
2 142 10 10 10 194.142
3 143 27 27 27 194.143
144 48 48 48 194.144 48
1 145 49 49 49 194.145
2 146 26 26 26 194.146
147 51 51 51 194.147 51
148 52 52 52 194.148 52
149 53 53 53 194.149 53
150 54 54 54 194.150 54
151 8 8 8 194.151 8
152 56 56 56 194.152 56
153 57 57 57 194.153 57
154 58 58 58 194.154 58
155 59 59 59 194.155 59
156 4 4 4 194.156 4
157 20 20 20 194.157 20
158 62 62 62 194.158 62
159 255 255 95 194.159 255 ##
160 65 65 65 194.160 128.65
161 170 170 170 194.161 128.66
162 74 74 176 194.162 128.67 ##
163 177 177 177 194.163 128.68
164 159 159 159 194.164 128.69
165 178 178 178 194.165 128.70
166 106 106 208 194.166 128.71 ##
167 181 181 181 194.167 128.72
168 189 187 121 194.168 128.73 ** ##
169 180 180 180 194.169 128.74
170 154 154 154 194.170 128.81
171 138 138 138 194.171 128.82
172 95 176 186 194.172 128.83 ** ##
173 202 202 202 194.173 128.84
174 175 175 175 194.174 128.85
175 188 188 161 194.175 128.86 ##
176 144 144 144 194.176 128.87
177 143 143 143 194.177 128.88
178 234 234 234 194.178 128.89
179 250 250 250 194.179 128.98
180 190 190 190 194.180 128.99
181 160 160 160 194.181 128.100
182 182 182 182 194.182 128.101
183 179 179 179 194.183 128.102
184 157 157 157 194.184 128.103
185 218 218 218 194.185 128.104
186 155 155 155 194.186 128.105
187 139 139 139 194.187 128.106
188 183 183 183 194.188 128.112
189 184 184 184 194.189 128.113
190 185 185 185 194.190 128.114
191 171 171 171 194.191 128.115
192 100 100 100 195.128 138.65
193 101 101 101 195.129 138.66
194 98 98 98 195.130 138.67
195 102 102 102 195.131 138.68
196 99 99 99 195.132 138.69
197 103 103 103 195.133 138.70
198 158 158 158 195.134 138.71
199 104 104 104 195.135 138.72
200 116 116 116 195.136 138.73
201 113 113 113 195.137 138.74
202 114 114 114 195.138 138.81
203 115 115 115 195.139 138.82
204 120 120 120 195.140 138.83
205 117 117 117 195.141 138.84
206 118 118 118 195.142 138.85
207 119 119 119 195.143 138.86
208 172 172 172 195.144 138.87
209 105 105 105 195.145 138.88
210 237 237 237 195.146 138.89
211 238 238 238 195.147 138.98
212 235 235 235 195.148 138.99
213 239 239 239 195.149 138.100
214 236 236 236 195.150 138.101
215 191 191 191 195.151 138.102
216 128 128 128 195.152 138.103
217 253 253 224 195.153 138.104 ##
218 254 254 254 195.154 138.105
219 251 251 221 195.155 138.106 ##
220 252 252 252 195.156 138.112
221 173 186 173 195.157 138.113 ** ##
222 174 174 174 195.158 138.114
223 89 89 89 195.159 138.115
224 68 68 68 195.160 139.65
225 69 69 69 195.161 139.66
226 66 66 66 195.162 139.67
227 70 70 70 195.163 139.68
228 67 67 67 195.164 139.69
229 71 71 71 195.165 139.70
230 156 156 156 195.166 139.71
231 72 72 72 195.167 139.72
232 84 84 84 195.168 139.73
233 81 81 81 195.169 139.74
234 82 82 82 195.170 139.81
235 83 83 83 195.171 139.82
236 88 88 88 195.172 139.83
237 85 85 85 195.173 139.84
238 86 86 86 195.174 139.85
239 87 87 87 195.175 139.86
240 140 140 140 195.176 139.87
241 73 73 73 195.177 139.88
242 205 205 205 195.178 139.89
243 206 206 206 195.179 139.98
244 203 203 203 195.180 139.99
245 207 207 207 195.181 139.100
246 204 204 204 195.182 139.101
247 225 225 225 195.183 139.102
248 112 112 112 195.184 139.103
249 221 221 192 195.185 139.104 ##
250 222 222 222 195.186 139.105
251 219 219 219 195.187 139.106
252 220 220 220 195.188 139.112
253 141 141 141 195.189 139.113
254 142 142 142 195.190 139.114
255 223 223 223 195.191 139.115
如果您更愿意按 CCSID 0037 顺序查看上表而不是 ASCII + Latin-1
订购然后通过以下方式运行表格:
食谱 4
珀尔\
-ne '如果(/.{29}\d{1,3}\s{2,4}\d{1,3}\s{2,4}\d{1,3}\s{2,4}\d{1,3}/)'\
-e '{push(@l,$_)}' \
-e 'END{打印地图{$_->[0]}' \
-e ' sort{$a->[1] <=> $b->[1]}' \
-e '地图{[$_,substr($_,34,3)]}@l;}' perlebcdic.pod
如果您更愿意按 CCSID 1047 顺序查看它,请更改最后一行中的数字 34
到 39,像这样:
食谱 5
珀尔\
-ne '如果(/.{29}\d{1,3}\s{2,4}\d{1,3}\s{2,4}\d{1,3}\s{2,4}\d{1,3}/)'\
-e '{push(@l,$_)}' \
-e 'END{打印地图{$_->[0]}' \
-e ' sort{$a->[1] <=> $b->[1]}' \
-e '地图{[$_,substr($_,39,3)]}@l;}' perlebcdic.pod
如果您希望以 POSIX-BC 顺序查看它,请将最后一行中的数字 34 更改为
44,像这样:
食谱 6
珀尔\
-ne '如果(/.{29}\d{1,3}\s{2,4}\d{1,3}\s{2,4}\d{1,3}\s{2,4}\d{1,3}/)'\
-e '{push(@l,$_)}' \
-e 'END{打印地图{$_->[0]}' \
-e ' sort{$a->[1] <=> $b->[1]}' \
-e '地图{[$_,substr($_,44,3)]}@l;}' perlebcdic.pod
表 in 十六进制, 排序 in 1047 秩序
自从本文档首次编写以来,该约定已变得越来越好用
代码点的十六进制表示法。 用食谱来做到这一点并进行排序是一个
多步骤的过程,所以这里为了方便起见,是上面的表格,重新排序在
Code Page 1047 顺序,并使用十六进制表示法。
ISO
8859-1 POS-CCSID
CCSID CCSID CCSID IX-1047
字符 0819 0037 1047 BC UTF-8 UTF-EBCDIC
-------------------------------------------------- -------------------
00 00 00 00 00 00
01 01 01 01 01 01
02 02 02 02 02 02
03 03 03 03 03 03
9C 04 04 04 C2.9C 04
09 05 05 05 09 05
86 06 06 06 C2.86 06
7F 07 07 07 7F 07
97 08 08 08 C2.97 08
8D 09 09 09 C2.8D 09
2E 8A 0A 0A C0E 2.8A
0B 0B 0B 0B 0B 0B
0C 0C 0C 0C 0C 0C
0D 0D 0D 0D 0D 0D
0E 0E 0E 0E 0E 0E
0F 0F 0F 0F 0F 0F
10 10 10 10 10 10
1 11 11 11 11 11
2 12 12 12 12 12
3 13 13 13 13 13
9D 14 14 14 C2.9D 14
0A 25 15 15 0A 15 **
08 16 16 16 08 16
87 17 17 17 C2.87 17
18 18 18 18 18 18
19 19 19 19 19 19
2 92A 1A 1A C1 2.92A
3F 8B 1B 1B C1F 2.8B
1C 1C 1C 1C 1C 1C
一维一维一维一维一维一维
1E 1E 1E 1E 1E 1E
1F 1F 1F 1F 1F 1F
80 20 20 20 C2.80 20
81 21 21 21 C2.81 21
82 22 22 22 C2.82 22
83 23 23 23 C2.83 23
84 24 24 24 C2.84 24
85 15 25 25 C2.85 25 **
17 26 26 26 17 26
1B 27 27 27 1B 27
88 28 28 28 C2.88 28
89 29 29 29 C2.89 29
8A 2A 2A 2A C2.8A 2A
8B 2B 2B 2B C2.8B 2B
8C 2C 2C 2C C2.8C 2C
05 二维 二维 二维 2 二维
06 2E 2E 2E 06 2E
07 2F 2F 2F 07 2F
90 30 30 30 C2.90 30
1 91 31 31 C31 2.91
16 32 32 32 16 32
93 33 33 33 C2.93 33
94 34 34 34 C2.94 34
95 35 35 35 C2.95 35
96 36 36 36 C2.96 36
04 37 37 37 04 37
98 38 38 38 C2.98 38
99 39 39 39 C2.99 39
9A 3A 3A 3A C2.9A 3A
9B 3B 3B 3B C2.9B 3B
4 14C 3C 3C 3 14C
15 3D 3D 3D 15 3D
9E 3E 3E 3E C2.9E 3E
1A 3F 3F 3F 1A 3F
20 40 40 40 20 40
A0 41 41 41 C2.A0 80.41
E2 42 42 42 C3.A2 8B.43
E4 43 43 43 C3.A4 8B.45
E0 44 44 44 C3.A0 8B.41
E1 45 45 45 C3.A1 8B.42
E3 46 46 46 C3.A3 8B.44
E5 47 47 47 C3.A5 8B.46
E7 48 48 48 C3.A7 8B.48
F1 49 49 49 C3.B1 8B.58
A2 4A 4A B0 C2.A2 80.43 ##
。 2E 4B 4B 4B 2E 4B
< 3C 4C 4C 4C 3C 4C
( 28 4D 4D 4D 28 4D
+ 2B 4E 4E 4E 2B 4E
| 7C 4F 4F 4F 7C 4F
& 26 50 50 50 26 50
E9 51 51 51 C3.A9 8B.4A
EA 52 52 52 C3.AA 8B.51
EB 53 53 53 C3.AB 8B.52
E8 54 54 54 C3.A8 8B.49
ED 55 55 55 C3.AD 8B.54
EE 56 56 56 C3.AE 8B.55
EF 57 57 57 C3.AF 8B.56
EC 58 58 58 C3.AC 8B.53
DF 59 59 59 C3.9F 8A.73
! 21 5A 5A 5A 21 5A
$ 24 5B 5B 5B 24 5B
* 2A 5C 5C 5C 2A 5C
) 29 5D 5D 5D 29 5D
; 3B 5E 5E 5E 3B 5E
^ 5E B0 5F 6A 5E 5F ** ##
- 二维 2 60 60 二维 60
/ 2F 61 61 61 2F 61
C2 62 62 62 C3.82 8A.43
C4 63 63 63 C3.84 8A.45
C0 64 64 64 C3.80 8A.41
C1 65 65 65 C3.81 8A.42
C3 66 66 66 C3.83 8A.44
C5 67 67 67 C3.85 8A.46
C7 68 68 68 C3.87 8A.48
D1 69 69 69 C3.91 8A.58
A6 6A 6A D0 C2.A6 80.47 ##
, 2C 6B 6B 6B 2C 6B
% 25 6C 6C 6C 25 6C
_ 5F 6D 6D 6D 5F 6D
> 3E 6E 6E 6E 3E 6E
? 3F 6F 6F 6F 3F 6F
F8 70 70 70 C3.B8 8B.67
C9 71 71 71 C3.89 8A.4A
CA 72 72 72 C3.8A 8A.51
CB 73 73 73 C3.8B 8A.52
C8 74 74 74 C3.88 8A.49
CD 75 75 75 C3.8D 8A.54
CE 76 76 76 C3.8E 8A.55
CF 77 77 77 C3.8F 8A.56
CC 78 78 78 C3.8C 8A.53
` 60 79 79 4A 60 79 ##
: 3A 7A 7A 7A 3A 7A
#23 7B 7B 7B 23 7B
@ 40 7C 7C 7C 40 7C
' 27 7D 7D 7D 27 7D
= 3D 7E 7E 7E 3D 7E
" 22 7F 7F 7F 22 7F
D8 80 80 80 C3.98 8A.67
61 81 81 81 61 81
62 82 82 82 62 82
63 83 83 83 63 83
64 84 84 84 64 84
65 85 85 85 65 85
66 86 86 86 66 86
克 67 87 87 87 67 87
小时 68 88 88 88 68 88
我 69 89 89 89 69 89
AB 8A 8A 8A C2.AB 80.52
BB 8B 8B 8B C2.BB 80.6A
F0 8C 8C 8C C3.B0 8B.57
FD 8D 8D 8D C3.BD 8B.71
FE 8E 8E 8E C3.BE 8B.72
B1 8F 8F 8F C2.B1 80.58
B0 90 90 90 C2.B0 80.57
6A 91 91 91 6A 91
6B 92 92 92 6B 92
6C 93 93 93 6C 93
米 6D 94 94 94 6D 94
6E 95 95 95 6E 95
6F 96 96 96 6F 96
70 97 97 97 70 97
71 98 98 98 71 98
72 99 99 99 72 99
AA 9A 9A 9A C2.AA 80.51
BA 9B 9B 9B C2.BA 80.69
E6 9C 9C 9C C3.A6 8B.47
B8 9D 9D 9D C2.B8 80.67
C6 9E 9E 9E C3.86 8A.47
A4 9F 9F 9F C2.A4 80.45
B5 A0 A0 A0 C2.B5 80.64
~ 7E A1 A1 FF 7E A1 ##
73 A2 A2 A2 73 A2
吨 74 A3 A3 A3 74 A3
75 A4 A4 A4 75 A4
v 76 A5 A5 A5 76 A5
w 77 A6 A6 A6 77 A6
× 78 A7 A7 A7 78 A7
是 79 A8 A8 A8 79 A8
7A A9 A9 A9 7A A9
A1 AA AA AA C2.A1 80.42
BF AB AB AB C2.BF 80.73
D0 AC AC AC C3.90 8A.57
[ 5B BA AD BB 5B AD ** ##
DE AE AE AE C3.9E 8A.72
AE AF AF AF C2.AE 80.55
AC 5F B0 BA C2.AC 80.53 ** ##
A3 B1 B1 B1 C2.A3 80.44
A5 B2 B2 B2 C2.A5 80.46
B7 B3 B3 B3 C2.B7 80.66
A9 B4 B4 B4 C2.A9 80.4A
A7 B5 B5 B5 C2.A7 80.48
B6 B6 B6 B6 C2.B6 80.65
BC B7 B7 B7 C2.BC 80.70
BD B8 B8 B8 C2.BD 80.71
BE B9 B9 B9 C2.BE 80.72
DD AD BA AD C3.9D 8A.71 ** ##
A8 BD BB 79 C2.A8 80.49 ** ##
AF BC BC A1 C2.AF 80.56 ##
] 5D BB BD 5D BD **
B4 BE BE C2.B4 80.63
D7 高炉 高炉 高炉 C3.97 8A.66
{ 7B C0 C0 FB 7B C0 ##
41 C1 C1 C1 41 C1
B 42 C2 C2 C2 42 C2
C 43 C3 C3 C3 43 C3
D 44 C4 C4 C4 44 C4
E 45 C5 C5 C5 45 C5
F 46 C6 C6 C6 46 C6
G 47 C7 C7 C7 47 C7
高 48 C8 C8 C8 48 C8
49 C9 C9 C9 49 C9
AD CA CA CA C2.AD 80.54
F4 CB CB CB C3.B4 8B.63
F6 CC CC CC C3.B6 8B.65
F2 CD CD CD C3.B2 8B.59
F3 CE CE CE C3.B3 8B.62
F5 CF CF CF C3.B5 8B.64
} 7D D0 D0 FD 7D D0 ##
J 4A D1 D1 D1 4A D1
K 4B D2 D2 D2 4B D2
大号 4C D3 D3 D3 4C D3
中号 4D D4 D4 D4 4D D4
N 4E D5 D5 D5 4E D5
○ 4F D6 D6 D6 4F D6
50 D7 D7 D7 50 D7
问 51 D8 D8 D8 51 D8
R 52 D9 D9 D9 52 D9
B9 DA DA DA C2.B9 80.68
FB DB DB DB C3.BB 8B.6A
FC DC DC DC C3.BC 8B.70
F9 DD DD C0 C3.B9 8B.68 ##
FA DE DE DE C3.BA 8B.69
FF DF DF DF C3.BF 8B.73
\ 5C E0 E0 BC 5C E0 ##
F7 E1 E1 E1 C3.B7 8B.66
小号 53 E2 E2 E2 53 E2
T 54 E3 E3 E3 54 E3
U 55 E4 E4 E4 55 E4
V 56 E5 E5 E5 56 E5
宽 57 E6 E6 E6 57 E6
X 58 E7 E7 E7 58 E7
是 59 E8 E8 E8 59 E8
Z 5A E9 E9 E9 5A E9
B2 EA EA EA C2.B2 80.59
D4 EB EB EB C3.94 8A.63
D6 EC EC EC C3.96 8A.65
D2 ED ED ED C3.92 8A.59
D3 EE EE EE C3.93 8A.62
D5 EF EF EF C3.95 8A.64
0 30 F0 F0 F0 30 F0
1 31 F1 F1 F1 31 F1
2 32 F2 F2 F2 32 F2
3 33 F3 F3 F3 33 F3
4 34 F4 F4 F4 34 F4
5 35 F5 F5 F5 35 F5
6 36 F6 F6 F6 36 F6
7 37 F7 F7 F7 37 F7
8 38 F8 F8 F8 38 F8
9 39 F9 F9 F9 39 F9
B3 FA FA FA C2.B3 80.62
DB FB FB DD C3.9B 8A.6A ##
直流 FC FC FC C3.9C 8A.70
D9 FD FD E0 C3.99 8A.68 ##
DA FE FE FE C3.9A 8A.69
9F FF 5F C2.9F FF ##
识别 字符 守则 集合
可以确定您正在操作的字符集。 但首先你
需要非常确定你需要这样做。 你的代码会更简单,而且可能
如果您不必测试字符集并做不同的事情,就像便携一样,
取决于。 实际上只有极少数情况下不容易写
可移植到所有字符集的直线代码。 参见“Unicode 和 EBCDIC”
perluniintro 了解如何可移植地指定字符。
但是在某些情况下,您可能想知道正在运行的字符集
在下面。 一个可能的例子是在性能很差的内部循环中进行排序
危急。
要确定您是在 ASCII 还是 EBCDIC 下运行,您可以使用返回值
"ord()" 或 "chr()" 来测试一个或多个字符值。 例如:
$is_ascii = "A" eq CHR(65);
$is_ebcdic = "A" eq CHR(193);
$is_ascii = ord("A") == 65;
$is_ebcdic = ord("A") == 193;
甚至不需要区分 EBCDIC 代码页,但要这样做,请尝试查看
在它们之间不同的一个或多个字符处。
$is_ascii = ord('[') == 91;
$is_ebcdic_37 = ord('[') == 186;
$is_ebcdic_1047 = ord('[') == 173;
$is_ebcdic_POSIX_BC = ord('[') == 187;
但是,编写如下测试是不明智的:
$is_ascii = "\r" ne CHR(13); # 错误的
$is_ascii = "\n" ne CHR(10); # 不建议
显然,第一个将无法将大多数 ASCII 平台与
CCSID 0037、1047 或 POSIX-BC EBCDIC 平台,因为 ""\r" eq CHR(13)”在所有
那些编码的字符集。 但也要注意,因为 "\n" 是 "CHR(13)" 和 "\r" 是
"CHR(10)" 在旧的 Macintosh(这是一个 ASCII 平台)上,第二个 $is_ascii 测试将
导致麻烦那里。
要确定 perl 是否是在 EBCDIC 代码页下构建的,您可以使用
配置模块如下:
使用配置;
$is_ebcdic = $Config{'ebcdic'} eq 'define';
转换
“utf8::unicode_to_native()” 和 “utf8::native_to_unicode()”
这些函数在一种编码中接受一个输入数字代码点并返回它的
等价的价值在另一个。
参见utf8。
翻译///
为了将字符串从一个字符集转换为另一个简单的列表
数字,例如上表右列中的数字,以及 Perl 的“tr///”
操作员就是所需要的。 表中的数据按 ASCII/Latin1 顺序排列,因此
EBCDIC 列提供易于使用的 ASCII/Latin1 到 EBCDIC 操作,这些操作也是
容易逆转。
例如,要将 ASCII/Latin1 转换为代码页 037,请使用第二个的输出
来自配方 2 输出的数字列(修改为添加“\”字符),并将其用于
"tr///" 像这样:
$cp_037 =
'\x00\x01\x02\x03\x37\x2D\x2E\x2F\x16\x05\x25\x0B\x0C\x0D\x0E\x0F' .
'\x10\x11\x12\x13\x3C\x3D\x32\x26\x18\x19\x3F\x27\x1C\x1D\x1E\x1F' .
'\x40\x5A\x7F\x7B\x5B\x6C\x50\x7D\x4D\x5D\x5C\x4E\x6B\x60\x4B\x61' .
'\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\x7A\x5E\x4C\x7E\x6E\x6F' .
'\x7C\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xD1\xD2\xD3\xD4\xD5\xD6' .
'\xD7\xD8\xD9\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xBA\xE0\xBB\xB0\x6D' .
'\x79\x81\x82\x83\x84\x85\x86\x87\x88\x89\x91\x92\x93\x94\x95\x96' .
'\x97\x98\x99\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xC0\x4F\xD0\xA1\x07' .
'\x20\x21\x22\x23\x24\x15\x06\x17\x28\x29\x2A\x2B\x2C\x09\x0A\x1B' .
'\x30\x31\x1A\x33\x34\x35\x36\x08\x38\x39\x3A\x3B\x04\x14\x3E\xFF' .
'\x41\xAA\x4A\xB1\x9F\xB2\x6A\xB5\xBD\xB4\x9A\x8A\x5F\xCA\xAF\xBC' .
'\x90\x8F\xEA\xFA\xBE\xA0\xB6\xB3\x9D\xDA\x9B\x8B\xB7\xB8\xB9\xAB' .
'\x64\x65\x62\x66\x63\x67\x9E\x68\x74\x71\x72\x73\x78\x75\x76\x77' .
'\xAC\x69\xED\xEE\xEB\xEF\xEC\xBF\x80\xFD\xFE\xFB\xFC\xAD\xAE\x59'。
'\x44\x45\x42\x46\x43\x47\x9C\x48\x54\x51\x52\x53\x58\x55\x56\x57' .
'\x8C\x49\xCD\xCE\xCB\xCF\xCC\xE1\x70\xDD\xDE\xDB\xDC\x8D\x8E\xDF';
我的 $ebcdic_string = $ascii_string;
评估 '$ebcdic_string =~ tr/\000-\377/' 。 $cp_037 。 '/';
要将 EBCDIC 037 转换为 ASCII,只需反转 tr/// 参数的顺序,如下所示:
我的 $ascii_string = $ebcdic_string;
评估 '$ascii_string =~ tr/' 。 $cp_037 。 '/\000-\377/';
类似地,可以从配方 2 的第三个数字列的输出中获得一个
$cp_1047 表。 配方 2 输出的第四个数字列可以提供一个
$cp_posix_bc 表也适用于转码。
如果您想查看逆表,您首先必须对所需的表进行排序
方法 4、5 或 6 中的数字列,然后获取第一个数字列的输出。
的iconv
XPG 可操作性通常意味着存在 的iconv 可从 shell 或
来自 C 库。 有关 iconv 的信息,请查阅系统文档。
在 OS/390 或 z/OS 上,请参阅 的iconv(1) 手册页。 调用“iconv”shell 实用程序的一种方法
从 perl 内部将是:
# OS/390 或 z/OS 示例
$ascii_data = `echo '$ebcdic_data'| iconv -f IBM-1047 -t ISO8859-1`
或逆映射:
# OS/390 或 z/OS 示例
$ebcdic_data = `echo '$ascii_data'| iconv -f ISO8859-1 -t IBM-1047`
对于其他基于 Perl 的转换选项,请参阅 CPAN 上的“Convert::*”模块。
C 劳动教养
OS/390 和 z/OS C 运行时库提供“_atoe()”和“_etoa()”函数。
操作员 差异性
“..”范围运算符在 EBCDIC 平台上谨慎处理某些字符范围。
例如,以下数组在 EBCDIC 平台上将有 XNUMX 个元素
或 ASCII 平台:
@alphabet = ('A'..'Z'); # $#alphabet == 25
位运算符,例如 & ^ | 对字符串进行操作时可能会返回不同的结果
或在 EBCDIC 平台上运行的 Perl 程序中的字符数据,而不是在
ASCII 平台。 这是一个改编自 perlop 的示例:
# 基于 EBCDIC 的示例
打印“jp\n”^“啊”; # 打印“JAPH\n”
打印“JA” | " ph\n"; # 打印 "japh\n"
打印 "JAPH\nJunk" & "\277\277\277\277\277"; # 打印 "japh\n";
打印 'p N$' ^ " E
ASCII 表中 32 个 C0 控制字符的一个有趣特性是它们
可以“字面上”构造为 Perl 中的控制字符,例如“(CHR(0)" eq "\c@")>
"(CHR(1)" eq "\cA")>等。EBCDIC平台上的Perl已被移植为采用"\c@"
至 CHR(0) 和 "\cA" 到 CHR(1) 等,但结果的字符取决于
您正在使用哪个代码页。 下表使用了标准的首字母缩略词
控件。 POSIX-BC 和 1047 集在整个范围内是相同的,并且不同于
0037 只设置在一个位置(小数点后 21 位)。 请注意,行终止符可能
在 ASCII 平台上由 "\cJ" 生成,但在 1047 或 POSIX-BC 平台上由 "\cU" 生成,并且
不能生成为“\c.letter”。 0037 平台上的控制字符。 还要注意的是
"\c\" 不能是字符串或正则表达式中的最后一个元素,因为它会吸收终止符。
但是“\c\X" 是一个“文件分隔符”与 X 支持所有 X. 离群值“\c?” 在
产生非 C0 控制“DEL”的 ASCII,在 EBCDIC 上产生异常控制“APC”,
不在连续控件块中的那个。 请注意,这其中的一个微妙之处是
那个“\c?” 在 ASCII 平台上是一个 ASCII 字符,但它不等同于任何
EBCDIC 平台中的 ASCII 字符。
字符 8859-1 0037 1047 && POSIX-BC
-------------------------------------------------- ---------------------
\c@ 0
\cA 1
\cB 2
\CC 3
\CD 4
\cE 5
\cF 6
\cG 7
\CH 8
\cI 9
\cJ 10
\cK 11
\cL 12
\cm 13
\cN 14
\CO 15
\cp 16
\cQ 17
\cR 18
\cS 19
\cT 20
\cU 21 **
\CV 22
\cW 23
\cX 24
\cY 25
\cZ 26
\c[ 27
\c\X 28 X X X
\c] 29
\c^ 30
\c_31
\C? *
"*" 注:"\c?" 映射到 ASCII 平台上的序数 127(“DEL”),但由于序数 127 是一个
不是 EBCDIC 机器上的控制字符,“\c?” 而是将它们映射到“APC”,即
在 255 和 0037 中为 1047,在 POSIX-BC 中为 95。
功能 差异性
"chr()" "chr()" 必须给出一个 EBCDIC 代码编号参数以产生所需的字符
EBCDIC 平台上的返回值。 例如:
$CAPITAL_LETTER_A = CHR(193);
UTF-EBCDIC 中可表示的最大代码点是 U+7FFF_FFFF。 如果你
对较大的值执行“chr()”,运行时错误(类似于除以 0)将
发生。
"ord()" "ord()" 将在 EBCDIC 平台上返回 EBCDIC 代码数值。 例如:
$the_number_193 = ord("A");
“盒()”
“pack()”的“c”和“C”模板取决于字符集编码。
EBCDIC 的用法示例包括:
$foo = pack("CCCC",193,194,195,196);
# $foo eq "ABCD"
$foo = pack("C4",193,194,195,196);
# 一样
$foo = pack("ccxxcc",193,194,195,196);
# $foo eq "AB\0\0CD"
“U”模板已被移植为所有平台上的“Unicode”,以便
包(“U”,65)eq'A'
在所有平台上都是如此。 如果您想要低 256 的本机代码点,请使用
“W”模板。 这意味着等价
pack("W", ord($character)) eq $character
unpack("W", $character) == ord $character
将举行。
UTF-EBCDIC 中可表示的最大代码点是 U+7FFF_FFFF。 如果你
尝试将更大的值打包成一个字符,一个运行时错误(类似于除法
by 0) 会发生。
“打印()”
必须小心传递给打印的标量和字符串,其中包含
ASCII 编码。 发生这种情况的一个常见位置是在 MIME 的输出中
用于 CGI 脚本编写的类型标头。 例如,许多 Perl 编程指南
推荐类似的东西:
打印“内容类型:\ttext/html\015\012\015\012”;
# 这在 EBCDIC 上可能是错误的
你可以写
打印“内容类型:\ttext/html\r\n\r\n”; # 对 DGW 等人没问题
并让它便携地工作。
这是因为从 EBCDIC 到 ASCII 的转换是由 Web 服务器在
这个案例。 有关更多详细信息,请查阅您的 Web 服务器的文档。
“printf()”
可以将字符转换为数字的格式,反之亦然
在 EBCDIC 平台上执行时,它们与 ASCII 对应物不同。
例如:
printf("%c%c%c",193,194,195); # 打印 ABC
“种类()”
EBCDIC 排序结果可能与 ASCII 排序结果不同,特别是对于混合大小写
字符串。 这将在下面更详细地讨论。
“sprintf()”
请参阅上面对“printf()”的讨论。 使用 sprintf 的一个例子是
是:
$CAPITAL_LETTER_A = sprintf("%c",193);
“解包()”
请参阅上面对“pack()”的讨论。
请注意,可以通过在 Unicode 中指定内容来为这些编写可移植的代码
数字,并使用转换函数:
printf("%c",utf8::unicode_to_native(65)); # 全部打印 A
# 平台
打印 utf8::native_to_unicode(ord("A")); # 同样,打印 65
有关其他选项,请参阅 perluniintro 中的“Unicode and EBCDIC”和“CONVERSIONS”。
定期 表达 差异性
您可以像使用 ASCII 平台的人一样编写正则表达式。
但请记住,使用八进制或十六进制表示法来指定特定的代码点将
为您提供 EBCDIC 代码页本机映射到它的字符。 (这也是真的
所有双引号字符串。)如果你想便携地编写,只需使用“\N{U+...}”
在您会使用“\x{...}”的任何地方使用符号,并且不要在以下位置使用八进制符号
所有。
从 Perl v5.22 开始,这适用于方括号字符类中的范围。 如果你
例如,“qr/[\N{U+20}-\N{U+7F}]/”,表示字符“\N{U+20}”,
"\N{U+21}", ..., "\N{U+7F}"。 这个范围是 ASCII 的所有可打印字符
字符集包含。
在 v5.22 之前,您不能可移植地指定任何范围,除了(从 Perl v5.5.3 开始)
"[AZ]" 和 "[az]" 范围的所有子集都经过特殊编码以不拾取间隙
人物。 例如,诸如“o”(“o WITH CIRCUMFLEX”)之类的字符位于
“I”和“J”不会被正则表达式范围“/[HK]/”匹配。 但如果两者之一
范围端点中的一个明确是数字(并且都不是由“\N{U+...}”指定),
间隙字符匹配:
/[\x89-\x91]/
将匹配 "\x8e",即使 "\x89" 是 "i" 并且 "\x91 " 是 "j",而 "\x8e" 是一个间隙
字符,从字母的角度来看。
另一个需要警惕的结构是十六进制的不当使用(除非你使用
"\N{U+...}") 或正则表达式中的八进制常量。 考虑下面的一组
子:
子 is_c0 {
我的 $char = substr(shift,0,1);
$char =~ /[\000-\037]/;
}
子 is_print_ascii {
我的 $char = substr(shift,0,1);
$char =~ /[\040-\176]/;
}
子 is_delete {
我的 $char = substr(shift,0,1);
$char eq "\177";
}
子 is_c1 {
我的 $char = substr(shift,0,1);
$char =~ /[\200-\237]/;
}
sub is_latin_1 { # 但不是 ASCII; 不是 C1
我的 $char = substr(shift,0,1);
$char =~ /[\240-\377]/;
}
这些仅在 ASCII 平台上有效。 从 Perl v5.22 开始,只需更改
八进制常量等效于 "\N{U+...}" 值使它们可移植:
子 is_c0 {
我的 $char = substr(shift,0,1);
$char =~ /[\N{U+00}-\N{U+1F}]/;
}
子 is_print_ascii {
我的 $char = substr(shift,0,1);
$char =~ /[\N{U+20}-\N{U+7E}]/;
}
子 is_delete {
我的 $char = substr(shift,0,1);
$char eq "\N{U+7F}";
}
子 is_c1 {
我的 $char = substr(shift,0,1);
$char =~ /[\N{U+80}-\N{U+9F}]/;
}
sub is_latin_1 { # 但不是 ASCII; 不是 C1
我的 $char = substr(shift,0,1);
$char =~ /[\N{U+A0}-\N{U+FF}]/;
}
这里有一些替代的可移植方式来编写它们:
子 Is_c0 {
我的 $char = substr(shift,0,1);
返回 $char =~ /[[:cntrl:]]/a && ! is_delete($char);
# 或者:
# 返回 $char =~ /[[:cntrl:]]/
# && $char =~ /[[:ascii:]]/
#&&! is_delete($char);
}
子 is_print_ascii {
我的 $char = substr(shift,0,1);
返回 $char =~ /[[:print:]]/a;
# 或者:
# return $char =~ /[[:print:]]/ && $char =~ /[[:ascii:]]/;
# 或者
# 返回 $char
# =~ /[ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@AZ[\\\]^_`az{|}~] /;
}
sub is_delete {
我的 $char = substr(shift,0,1);
返回 utf8::native_to_unicode(ord $char) == 0x7F;
}
子 Is_c1 {
使用功能“unicode_strings”;
我的 $char = substr(shift,0,1);
return $char =~ /[[:cntrl:]]/ && $char !~ /[[:ascii:]]/;
}
sub Is_latin_1 { # 但不是 ASCII; 不是 C1
使用功能“unicode_strings”;
我的 $char = substr(shift,0,1);
返回 ord($char) < 256
&& $char !~ /[[:ascii:]]/
&& $char !~ /[[:cntrl:]]/;
}
另一种写“Is_latin_1()”的方法是使用范围内的字符
明确地:
子 Is_latin_1 {
我的 $char = substr(shift,0,1);
$char =~ /[ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAAA~AeAaAECEEEEEeIIIIe]
[-N~OOOO~OeXOUUUUeYPssaaaa~aeaaaeceeeeeiiiie`n~oooo~oeXouuuueypye]/x;
}
虽然这种形式可能会在网络传输中遇到麻烦(由于存在 8 位
字符)或非 ISO-拉丁字符集。 但它确实允许重写“Is_c1”
所以它适用于没有“unicode_strings”的 Perls(早于 v5.14):
sub Is_latin_1 { # 但不是 ASCII; 不是 C1
我的 $char = substr(shift,0,1);
返回 ord($char) < 256
&& $char !~ /[[:ascii:]]/
&! is_latin1($char);
}
袜子
大多数套接字编程采用网络字节顺序的 ASCII 字符编码。
例外情况可能包括在主机 Web 服务器下编写 CGI 脚本,其中服务器可能
为您负责翻译。 大多数主机 Web 服务器将 EBCDIC 数据转换为 ISO-8859-1
或 Unicode 输出。
排序
基于 ASCII 的字符集和 EBCDIC 字符集之间的一大区别是相对
按本机顺序排序时字符的位置。 最受关注的是上层
和小写字母、数字和下划线(“_”)。 在 ASCII 平台上
本机排序顺序的数字出现在大写字母之前
小写字母之前的下划线。 在 EBCDIC 上,下划线出现
首先,然后是小写字母,然后是大写字母,最后是数字。 如果
在基于 ASCII 的平台上排序,医生的两个字母缩写出现
在驱动器的两个字母缩写之前; 那是:
@sorted = sort(qw(Dr. dr.)); # @sorted 在 ASCII 上保持 ('Dr.','dr.'),
# 但是 ('dr.','Dr.') 在 EBCDIC 上
EBCDIC 中大写字母前小写的属性甚至被带到了拉丁语
1 EBCDIC 页,例如 0037 和 1047。一个例子是“Ee”(“E WITH DIAERESIS”,
203) 在 ASCII 平台上出现在 "ee" ("e WITH DIAERESIS", 235) 之前,但后者 (83)
在 EBCDIC 平台上出现在前者 (115) 之前。 (细心的读者会注意到,
"ss" "SMALL LETTER SHARP S" 的大写版本只是 "SS" 并且大写
“ye”(小“y WITH DIAERESIS”)和“X”(“MICRO SIGN”)的版本不在 0..255
范围但在 Unicode 中,在启用 Unicode 的 Perl 中)。
排序顺序将导致在 ASCII 平台上获得的结果与在 ASCII 平台上获得的结果之间存在差异
EBCDIC 平台。 以下是有关如何处理这些问题的一些建议
差异。
忽略 ASCII码 与 EBCDIC 分类 差异。
这是计算成本最低的策略。 它可能需要一些用户教育。
使用 VHDL 语言编写 a 分类 帮手 function
这是完全通用的,但计算成本最高的策略。 选一个
或其他字符集并转换为每个排序比较的字符集。 这是一个
转换为 ASCII 排序顺序的完整示例:
子 native_to_uni($) {
我的 $string = shift;
# 在 ASCII 平台上节省时间
返回 $string 如果 ord 'A' == 65;
我的 $output = "";
对于我的 $i (0 .. length($string) - 1) {
$输出
.= chr(utf8::native_to_unicode(ord(substr($string, $i, 1))));
}
# 将输入的 utf8ness 保留到输出上,即使它不需要
# 为 utf8
utf8::upgrade($output) 如果 utf8::is_utf8($string);
返回 $output;
}
sub ascii_order { # 排序助手
返回 native_to_uni($a) cmp native_to_uni($b);
}
排序 ascii_order @list;
MONO CASE 然后 分类 data (用于 非数字, 非下划线)
如果您不关心数字和下划线的排序位置,则可以执行以下操作
Free Introduction
sub case_insensitive_order { # 排序助手
返回 lc($a) cmp lc($b)
}
排序 case_insensitive_order @list;
如果性能是一个问题,并且您不在乎输出是否与
输入,使用“tr///”转换为数据中最常用的情况。 如果数据
主要是大写非Latin1,然后应用“tr/[az]/[AZ]/”,然后应用“sort()”。 如果
数据主要是小写非拉丁语1然后在排序前应用“tr/[AZ]/[az]/”。
如果数据主要是大写并包含 Latin-1 字符,则应用:
tr/[az]/[AZ]/;
tr/[aaaa~aaaaeceeeeeiiiie`n~oooo~oeouuuueyp]/[AAAA~AeAaAECEEEEeeIIIIe-N~OOOO~OeOUUUUeYP/;
s/ss/SS/g;
然后是“排序()”。 如果你有选择,最好把东西小写以避免
大写在Latin-1之外的两个Latin-1字符的问题:“ye”(小“y
WITH DIAERESIS”)和“X”(“MICRO SIGN”)。如果你确实需要大写,你可以;用
启用 Unicode 的 Perl,请执行以下操作:
tr/ye/\x{178}/;
tr/X/\x{39C}/;
演出 排序 on 一种 类型 of 平台 只。
该策略可以采用网络连接。 因此,它将在计算上
昂贵。
转型 FORMATS
有多种使用内部字符集映射转换数据的方法
服务于各种目的。 排序在上一节中讨论过,还有一些
接下来讨论其他更流行的映射技术。
网址 解码 和 编码
请注意,某些 URL 中包含十六进制 ASCII 代码点,以试图克服
字符或协议限制问题。 例如,波浪号字符不是在每个
键盘因此是形式的 URL:
http://www.pvhp.com/~pvhp/
也可以表示为:
http://www.pvhp.com/%7Evhp/
http://www.pvhp.com/%7epvhp/
其中 7E 是“~”的十六进制 ASCII 代码点。 这是一个解码这样的例子
任何 EBCDIC 代码页中的 URL:
$ url ='http://www.pvhp.com/%7Epvhp/';
$url =~s/%([0-9a-fA-F]{2})/
pack("c",utf8::unicode_to_native(hex($1)))/xge;
相反,这是在任何 EBCDIC 中对此类 URL 进行编码的任务的部分解决方案
代码页:
$ url ='http://www.pvhp.com/~pvhp/';
# 下面的正则表达式没有解决
# 映射为: ('.' => '%2E', '/' => '%2F', ':' => '%3A')
$url =~ s/([\t "#%&\(\),;<=>\?\@\[\\\]^`{|}~])/
sprintf("%%%02X",utf8::native_to_unicode(ord($1)))/xge;
其中更完整的解决方案将 URL 拆分为组件并应用完整的 s///
只替换适当的部分。
uu 编码 和 解码
"u" 模板到 "pack()" 或 "unpack()" 将以 EBCDIC 字符呈现 EBCDIC 数据
相当于他们的 ASCII 对应物。 例如,以下将打印“是
在 ASCII 或 EBCDIC 计算机上确实\n":
$all_byte_chrs = '';
对于 (0..255) { $all_byte_chrs .= chr($_); }
$uuencode_byte_chrs = pack('u', $all_byte_chrs);
($uu = <<'ENDOFHEREDOC') =~ s/^\s*//gm;
M``$"`P0%!@<("0H+#`T.#Q`1$A,4%187&!D:&QP='A\@(2(C)"4F)R@I*BLL
M+2XO,#$R,S0U-C<X.3H[/#T^/T!!0D-$149'2$E*2TQ-3D]045)35%565UA9
M6EM<75Y?8&%B8V1E9F=H:6IK;&UN;W!Q<G-T=79W>'EZ>WQ]?G^`@8*#A(6&
MAXB)BHN,C8Z/D)&2DY25EI>8F9J;G)V>GZ"AHJ.DI::GJ*FJJZRMKJ^PL;*S
MM+6VM[BYNKN\O;Z_P,'"P\3%QL?(R<K+S,W.S]#1TM/4U=;7V-G:V]S=WM_@
?X>+CY.7FY^CIZNOL[>[O\/'R\_3U]O?X^?K[_/W^_P``
结束
如果($uuencode_byte_chrs eq $uu){
打印“是”;
}
$uudecode_byte_chrs = unpack('u', $uuencode_byte_chrs);
如果($uudecode_byte_chrs eq $all_byte_chrs){
打印“确实\n”;
}
这是一个非常简单的 uudecoder 可以在 EBCDIC 上运行:
#!/ usr / local / bin / perl
$_ = <> until ($mode,$file) = /^begin\s*(\d*)\s*(\S*)/;
open(OUT, "> $file") if $file ne "";
而(<>){
最后 if /^end/;
下一个 if /[az]/;
下一个除非 int((((utf8::native_to_unicode(ord()) - 32 ) & 077)
+ 2) / 3)
== int(长度() / 4);
打印出解包(“u”,$_);
}
关闭(输出);
chmod oct($模式), $文件;
引用可打印 编码 和 解码
在 ASCII 编码的平台上,可以去除可打印集之外的字符
使用:
# 此 QP 编码器仅适用于 ASCII
$qp_string =~ s/([=\x00-\x1F\x80-\xFF])/
sprintf("=%02X",ord($1))/xge;
从 Perl v5.22 开始,这是微不足道的改变,可以在 ASCII 和
EBCDIC 平台。
# 这个 QP 编码器适用于 ASCII 和 EBCDIC
$qp_string =~ s/([=\N{U+00}-\N{U+1F}\N{U+80}-\N{U+FF}])/
sprintf("=%02X",ord($1))/xge;
对于早期的 Perls,在 ASCII 和 EBCDIC 平台上工作的 QP 编码器看起来像
有点像以下内容:
$delete = utf8::unicode_to_native(ord("\x7F"));
$qp_string =~
s/([^[:print:]$删除])/
sprintf("=%02X",utf8::native_to_unicode(ord($1)))/xage;
(尽管在生产代码中,替换可能在 EBCDIC 分支中使用
函数调用并在 ASCII 分支中单独调用,无需花费身份映射;
在 Perl v5.22 中,身份映射被优化了所以没有任何费用,但是
上面的替代方案更简单,也可在 v5.22 中使用)。
此类 QP 字符串可以通过以下方式解码:
# 这个 QP 解码器仅限于 ASCII
$string =~ s/=([[:xdigit:][[:xdigit:])/chr 十六进制 $1/ge;
$string =~ s/=[\n\r]+$//;
而同时适用于 ASCII 和 EBCDIC 平台的 QP 解码器看起来有点像
像下面这样:
$字符串=~ s/=([[:xdigit:][:xdigit:]])/
chr utf8::native_to_unicode(十六进制 $1)/xge;
$string =~ s/=[\n\r]+$//;
剖腹产 密码
将字母表移动一个或多个字符以进行加密的做法可以追溯到
几千年来,盖乌斯·朱利叶斯·凯撒在他的 高卢 战争
文本。 单个字母表移位有时称为旋转和移位量
在字符串 'rot' 或 "rot$n" 后以数字 $n 给出。 Rot0 和 rot26 将指定
拉丁字母表的 26 个英文字母的身份图。 Rot13 具有
有趣的属性是交替的后续调用是身份映射(因此 rot13
是它自己在 26 个字母轮换组中的非平凡逆)。 因此
以下是可在 ASCII 和 EBCDIC 平台上运行的 rot13 编码器和解码器:
#!/ usr / local / bin / perl
而(<>){
tr/n-za-mN-ZA-M/a-zA-Z/;
打印;
}
单线形式:
perl -ne 'tr/n-za-mN-ZA-M/a-zA-Z/;打印'
哈希 秩序 和 校验和
出于安全目的,Perl 在 ASCII 和 EBCDIC 上故意随机化哈希顺序
平台。
对于转换为 ASCII 的同一文件,EBCDIC 校验和会有所不同,反之亦然。
I18N AND L10N
至少原则上支持国际化(I18N)和本地化(L10N)
即使在 EBCDIC 平台上。 详细信息取决于系统,并在“操作系统
问题”部分。
多字节 字符 集合
Perl 使用多字节编码 UTF-EBCDIC。 在 v5.22 之前的 Perls 中,可能有
是这方面的各种错误。
传统多字节 EBCDIC 代码页 XXX。
OS 问题
EBCDIC Perl 程序员可能会关注一些与系统相关的问题。
OS / 400
PASE PASE 环境是 OS/400 的运行时环境,可以运行可执行文件
为 OS/400 中的 PowerPC AIX 构建; 见 perlos400。 PASE 基于 ASCII,而不是 EBCDIC-
基于 ILE。
IFS 访问
XXX。
OS / 390, z /操作系统
Perl 在 Unix Systems Services 或 USS 下运行。
“签名”
“SA_SIGINFO”可能有分段错误。
“chcp” 奇普 支持作为用于显示和更改代码页的 shell 实用程序。
参见 奇普(1)。
数据集访问
对于顺序数据集访问尝试:
我的@ds_records = `cat //DSNAME`;
要么:
my @ds_records = `cat //'HLQ.DSNAME'`;
另请参阅 CPAN 上的 OS390::Stdio 模块。
“图标” 的iconv 支持作为 shell 实用程序和 C RTL 例程。 另见
的iconv(1)和 的iconv(3) 手册页。
语言环境 支持语言环境。 当语言环境是另一个 EBCDIC 代码时可能会出现故障
在其他位置具有一些代码页变体字符的页面。
目前没有任何真正的 UTF-8 语言环境,即使有一些语言环境名称
包含字符串“UTF-8”。
有关语言环境的信息,请参阅 perllocale。 L10N 文件位于 /usr/nls/语言环境.
$Config{d_setlocale} 在 OS/390 或 z/OS 上是“定义”的。
POSIX-BC?
XXX。
使用 onworks.net 服务在线使用 perlebcdic