您正在从Perl 5.39.5查看此文档的版本。这是Perl的开发版本。

内容

名称

perlebcdic-在EBCDIC平台上运行Perl的注意事项

描述

探讨基于EBCDIC的计算机上Perl程序员面临的一些问题。

本文件中仍不完整的部分标有XXX。

早期的Perl版本可以在一些EBCDIC机器上运行,但在EBCDIC上运行的最后一个已知版本是v5.8.7,直到v5.22,那时Perl内核再次在z/OS上运行。理论上,它可以在OS/400或西门子的BS2000(或其后续产品)上运行,但这还没有经过测试。在v5.22和5.24中,不是CPAN上的所有模块,而是在z/OS上与核心Perl一起提供的。

如果您想在非z/OS EBCDIC机器上使用Perl,请在https://github.com/Perl/perl5/issues(网址:https://github.com/Perl/perl5/issues).

在EBCDIC平台上编写Perl与在“ASCII”一个,但有不同的潜在数字,我们很快就会看到。你必须了解这些“ASCII”因为文档有偏见,并且经常使用不适用于EBCDIC的示例数字。也有很少的CPAN模块是为EBCDIC编写的,并且不适用于ASCII;相反,绝大多数CPAN模块都是为ASCII编写的,有些模块可能恰好在EBCDIC上工作,而有些模块设计为可移植地在两者上工作。

如果您的代码只使用52个字母A-Z和A-Z,加上空格、数字0-9和Perl使用的标点符号,再加上一些由转义序列表示的控件,如\n个\t吨那么,使用Perl没有什么特别之处,并且您的代码可以在ASCII机器上正常工作,无需更改。

但如果您编写的代码使用\005表示TAB或\xC1表示“A”,或\xDF(xDF)意思是“∧”(小“y”然后,您的代码可以在EBCDIC平台上很好地工作,但不能在ASCII平台上工作。如果没有人想在ASCII平台上运行您的代码,那么这样做很好;但本文档中的偏见是编写可在EBCDIC和ASCII系统之间移植的代码。同样,如果您关心的每个字符都可以从键盘轻松输入,那么您不必了解ASCII,但许多键盘都不允许您直接输入,例如,字符\xDF(xDF),因此必须间接指定它,例如使用“\xDF”转义序列。在这种情况下,了解ASCII/Unicode字符集是最容易的。如果你知道小“∧”是U+00FF型,则可以将其指定为“\N{U+FF}”,并让计算机自动将其转换为\xDF(xDF)在您的平台上,并将其保留为\xFF(xFF)ASCII码。或者你可以指定它的名字,\N{拉丁文小写字母Y(带字母分隔符)并且不必知道数字。无论哪种方式都有效,但两者都需要熟悉Unicode。

通用字符代码集

ASCII码

美国信息交换标准代码(ASCII或US-ASCII)是一组从0到127(十进制)的整数,由使用ASCII的计算机进行标准化解释。例如,65表示字母“A”。范围0..127可以通过在7位二进制数字中设置各种位来覆盖,因此该集合有时被称为“7位ASCII”。美国国家标准协会文件ANSI X3.4-1986对ASCII进行了描述。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集合中,ASCII集合通常以各种语言出现,其中许多语言基于罗马或拉丁字母表。大多数是欧洲语言,但也有阿拉伯语、希腊语、希伯来语和泰语。网上有很多关于这些的参考资料。

拉丁语1(ISO 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编码源于霍尔瑞斯穿孔卡片编码的8位字节扩展,早于ASCII。卡片上的布局是这样的,为大小写字母字符设置了高位[a-z]【A-Z】,但在每个拉丁字母范围内都有空白,可以在表中看到在下面。这些差距可能会导致复杂性。

一些IBM EBCDIC字符集可以通过字符代码集标识号(CCSID号)或代码页号来获知。

Perl可以在运行下面列出的三个常用EBCDIC字符集中的任何一个的平台上编译。

13个变体字符

在IBM EBCDIC字符代码集中,有13个字符通常映射到不同的整数值。这些字符被称为13个“变体”字符,它们是:

\ [ ] { } ^ ~ ! # | $ @ `

当为平台编译Perl时,它会查看所有这些字符,以猜测平台使用的EBCDIC字符集,并相应地调整自身以适应该平台。如果平台使用的字符集不是Perl知道的三个字符集之一,Perl要么编译失败,要么错误地默默选择三个字符中的一个。

换行符(LF)实际上是一个第14个变体字符,Perl也会进行检查。

Perl识别的EBCDIC代码集

0037

字符代码集ID 0037是ASCII加拉丁文-1字符(即ISO 8859-1)到EBCDIC集的映射。0037用于在AS/400计算机上运行的OS/400操作系统上的北美英语地区。CCSID 0037在236处与ISO 8859-1不同;换句话说,他们只同意20个码位值。

1047

字符代码集ID 1047也是ASCII加拉丁文-1字符(即ISO 8859-1)到EBCDIC集的映射。1047在Unix System Services for OS/390或z/OS和OpenEdition for VM/ESA下使用。CCSID 1047在八个地方与CCSID 0037不同,在236个地方与ISO 8859-1不同。

POSIX-BC公司

西门子BS2000系统上使用的EBCDIC代码页与1047和0037不同。以下将其标识为POSIX-BC集合。与0037和1047一样,它在20个码位值中与ISO 8859-1相同。

Unicode代码点与EBCDIC代码点

在Unicode术语中代码点是分配给字符的数字:例如,在EBCDIC中,字符“a”通常被分配为数字193。在Unicode中,字符“A”被指定为数字65。ASCII和拉丁语-1(ISO 8859-1)中的所有代码点在Unicode中具有相同的含义。所有三个已识别的EBCDIC代码集都有256个代码点,并且在每个代码集中,所有256个代码点都映射到等效的Latin1代码点。显然,对于拉丁语1和这些代码页中的所有可打印字符,“A”将映射到“A”、“B”=>“B”、“%”=>”%“等。

事实证明,EBCDIC几乎与ASCII/Latin1C0控件和DELETE控件具有精确的等效项。(C0控件是ASCII代码点为0..0x1F的控件;如TAB、ACK、BEL等)在这些ASCII/EBCDIC控件之间设置映射。ASCII平台上的C1控件和其余EBCDIC控件之间没有如此精确的映射。所做的是将这些控件映射到另一个字符集中其他不匹配的字符,大多数是随意的。不管怎么说,现在EBCDIC中很少使用这些名称,而且他们的名字已经被删除,没有多少抱怨。例如,EO(八个一)EBCDIC控件(由八个一位=0xFF组成)映射到C1 APC控件(0x9F),并且不能使用名称“EO”。

EBCDIC控件提供三个可能的行终止符字符,即CR(0x0D)、LF(0x25)和NL(0x15)。在ASCII平台上,符号“NL”和“LF”指的是相同的字符,但在严格的EBCDIC术语中,它们是不同的。EBCDIC NL被映射到名为“NEL”的C1控件(“Next Line”;这里的映射非常有意义,因此不仅仅是任意的)。在一些EBCDIC平台上,此NL或NEL是典型的线路终止符。z/OS和BS2000也是如此。在这些平台中,C编译器将交换LF和NEL代码点,以便“\n”是0x15,并引用NL。Perl也这样做;你可以在代码表中看到它在下面这使得事情通常“只是工作”,而您甚至不必意识到存在交换。

Unicode和UTF

UTF代表“Unicode转换格式”。UTF-8是一种基于ASCII和拉丁语-1将Unicode编码为8位字节块序列的方法。表示Unicode代码点所需的序列长度取决于该代码点的序号,数字越大,需要的字节越多。UTF-EBCDIC类似于UTF-8,但基于EBCDIC。它们非常相似,经常会将这两个术语混为一谈,并使用“UTF-8”表示ASCII平台上的UTF-8和EBCDIC平台上的UTF-EBCDIC。

您可能会看到术语“不变”字符或代码点。这只是意味着当以UTF-8(或UTF-EBCDIC)编码时,字符具有与不编码时相同的数值和表示形式。(注意,这是一个与“13个变体字符”上述内容。细心的散文会使用术语“UTF-8不变量”而不仅仅是“不变量”,但大多数情况下你会看到的是“不变性”。)例如,在大多数EBCDIC代码页中,“A”的序数值是193,在UTF-EBCDIC编码时也是193。当以UTF-8(或UTF-EBCDIC)编码时,所有UTF-8变体码点至少占用两个字节;根据定义,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-8编码的字符串长(很少短)。Perl扩展了UTF-8和UTF-EBCDIC,以便它们可以对超过Unicode最大值U+10FFFF的代码点进行编码。这两个扩展的构造都允许对适合64位字的任何代码点进行编码。

UTF-EBCDIC定义如下Unicode技术报告#16(通常称为TR16)。它是基于CCSID 1047定义的,不考虑其他代码页的差异。这允许在运行不同代码页的计算机之间轻松地交换文本,但使其无法用于其他代码页上的Perl。

这种不可用性的原因是,Perl的一个基本假设是,无论文本是否为UTF-8格式,它所关心的解析和词汇分析字符都是相同的。例如,Perl需要字符"["以具有相同的表示形式,无论包含它的字符串(或程序文本)是否为UTF-8编码。为了确保这一点,Perl将UTF-EBCDIC调整到特定的代码页,以便它期望的所有UTF-8不变字符实际上都是UTF-8不变量。这意味着在运行Perl的UTF-EBCDIC的一个版本的计算机上生成的文本必须翻译为运行另一个版本计算机的可理解文本。

TR16暗示了一种扩展UTF-EBCDIC的方法,以通过2 ** 31 - 1.Perl将此方法用于从上到下的代码点2 ** 30 - 1,但对较大的代码点使用了不兼容的方法,使其能够处理比其他方法大得多的代码点。

使用编码

从Perl 5.8开始,您可以使用标准模块Encode将EBCDIC转换为Latin-1代码点。Encode知道的EBCDIC字符集比当前编译Perl运行的字符集还要多。

使用编码“from_to”;我的%ebcdic=(176=>“cp37”,95=>“cp1047”,106=>“posix-bc”);#$x以EBCDIC码位表示from_to($x,$ebcdic{ord“^”},“latin1”);#$x是ISO 8859-1代码点

以及从拉丁语-1代码点到EBCDIC代码点

使用编码“from_to”;我的%ebcdic=(176=>“cp37”,95=>“cp1047”,106=>“posix-bc”);#$x是ISO 8859-1代码点from_to($x,'latin1',$ebcdic{ord'^'});#$x以EBCDIC码位表示

对于I/O,建议您使用PerlIO的自动翻译功能,请参阅珍珠岩.

由于5.8版Perl使用PerlIO I/O库。这使您能够对每个IO通道使用不同的编码。例如,您可以使用

使用编码;打开($f,“>:编码(ascii)”,“test.ascii”);打印$f“Hello World!\n”;打开($f,“>:编码(cp37)”,“test.ebcdic”);打印$f“Hello World!\n”;打开($f,“>:编码(latin1)”,“test.latin1”);打印$f“Hello World!\n”;打开($f,“>:编码(utf8)”,“test.utf8”);打印$f“Hello World!\n”;

获取四个文件,其中包含ASCII格式的“Hello World!”、CP 0037 EBCDIC、ISO 8859-1(拉丁语-1)(在本例中与ASCII相同,因为只打印ASCII字符)和UTF-EBCDIC(在本示例中与普通EBCDIC相同,因为仅打印EBCDIC和UTF-EBCDIC之间没有差异的字符)。请参阅文档编码::PerlIO了解详细信息。

由于PerlIO层在内部使用原始IO(字节),所有这些都完全忽略了文件系统的类型(ASCII或EBCDIC)。

单八分位表格

下表列出了ASCII和拉丁语1有序集,包括子集:C0控件(0..31)、ASCII图形(32..7e)、删除(7f)、C1控件(80.9f)和拉丁语-1(也称为ISO 8859-1)(a0..ff)。在表中,ASCII的拉丁1扩展名被标记为大致对应于Unicode标准6.1版尽管有如下替换s/拉丁语//s/VULGAR公司//在所有情况下;大写字母//在某些情况下;s/小写字母([A-Z])/\l$1/在其他一些情况下。使用Unicode 6.2缩写列出控件。0037和1047集合之间的差异标记为**1047和POSIX-BC集合之间的差异标记为##.全部订单()列出的数字是十进制的。如果您希望看到此表列出八进制值,则通过以下方式运行该表(即本文档的pod源文本,因为此配方可能无法与pod2_other_format翻译一起使用):

配方0
perl-ne'如果(/(.{29})(\d+)\s+(\d+)\s+\-e'{printf(“%s%-5.03o%-5.03o-5.03o%-5.03o%.03o\n”,$1,$2,$3,$4,$5)}'\perlebcdic.pod文件

如果您想保留UTF-x代码点,那么可以以脚本形式编写:

配方1
open(FH,“<perlebcdic.pod”)或die“无法打开perlebcdiac.pod:$!”;而(<FH>){如果(/(.{29})(\d+)\s+(\d+)\s+。?(\d*)\s+(\d+)\。?(\d*)/x){如果($7ne“&&$9ne”){打印(“%s%-5.03o%-5.03o%-50.3o%-5.003o%+5.03o%-3o.%-5o%-3o.%.03o\n”,$1,$2,$3,$4,$5,$6,$7,$8,$9);}埃尔西夫(7美元){打印(“%s%-5.03o%-5.03o%-50.3o%-5.003o%.5.03o%-3o.%-5o%.03o\n”,$1,$2,$3,$4,$5,$6,$7,$8);}其他{打印(“%s%-5.03o%-5.03o%-50.3o%-5.003o%.5.03o%-5.013o%.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
open(FH,“<perlebcdic.pod”)或die“无法打开perlebcdiac.pod:$!”;而(<FH>){如果(/(.{29})(\d+)\s+(\d+)\s+。?(\d*)\s+(\d+)\。?(\d*)/x){如果($7ne“&&$9ne”){打印(“%s%-5.02X%-5.02X%-502X%-5.02X%-5.02X%-2X.%-6.02X%02X.%02X\n”,$1,$2,$3,$4,$5,$6,$7,$8,$9);}埃尔西夫(7美元){打印(“%s%-5.02X%-5.02X%-50.2X%-5.2X%-502X%-2X.%-6.02X%02X\n”,$1,$2,$3,$4,$5,$6,$7,$8);}其他{打印(“%s%-5.02X%-5.02X%-50.2X%-5.002X%~5.02X%-5.02X%02X\n”,$1,$2,$3,$4,$5,$6,$8);}}}国际标准化组织8859-1销售点-CCSIDCCSID CCSID九CCSID-1047chr 0819 0037 1047 BC UTF-8 UTF-EBCDIC---------------------------------------------------------------------<NUL>0 0 0 0<SOH>1 1 1 1 11<STX>2 2 2 2<ETX>3 3 3 3<EOT>4 55 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**<VT>11 11 11 11<FF>12 12 12 12<CR>13 13 13 13<SO>14 14 14 14<SI>15 15 15 15 15 15 15 15<DLE>16 16 16 16 16 16 16<DC1>17 17 17 17<DC2>18 18 18 18<DC3>19 19 19 19<DC4>20 60 60 60 20 60<NAK>21 61 61 61 21 61<同步>22 50 50 50 22 50<欧洲贸易壁垒>23 38 38 38 23 38<加拿大>24 24 24 24<EOM>25 25 25 25<SUB>26 63 63 63 26 63<电子稳定控制系统>27 39 39 39 27 39<FS>28 28 28 28 2828 28<GS>29 29 29 29 2929 29<RS>30 30 30 30<美国>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       970                           48   240  240  240  48       2401                           49   241  241  241  49       2412                           50   242  242  242  50       2423                           51   243  243  243  51       2434                           52   244  244  244  52       2445                           53   245  245  245  53       2456                           54   246  246  246  54       2467                           55   247  247  247  55       2478                           56   248  248  248  56       2489                           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       124A 65 193 193 193193 65 193B 66 194 194 1944 66 194C 67195195195 195 67195D 68 196 196 196196 68 196电话:69 197 197 1971 69 197传真:7019819819819870198G 71 199 199 1991 71 199H 72 200 200 200 72 200我73 201 201 201 73 201J 74 209 209 208 74 209借74 209K 75 210 210 210 75 210电话电话76 211 211 21176 211电话:77 212 212 21277 212电话:78 213 213 213 78 213O 79 214 214 217 79 214电话电话:80 215 215 2150 80 215问81 216 216 2168 81 21682 217 217 218 82 217兰特S 83 226 226 227 83 226第83页电话84227227 227227 84 227U 85 228 228 228-85 228电话V 86 229 229 22S 229 86 229电话电话87 230 230 230 87 230X 88 231 231 231-88 231电话Y 89 232 232 232 89 232Z 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  ##a 9712912912997129号b 98 130 130 130 98 130电话c 99 131 131 13199 131电话电话:100 132 132 132100 132电子101133133101133传真:102 134 134 134102 134g 103 135 135 135 103 135克电话104 136 136 1361 104 136i 105 137 137 1371 105 137j 106 145 145 145106 145约106 145k 107 146 146 146-107 146电话l 108147147147108 147电话手机109 148 148 149 148电话:110 149 149 1491 110 149o 111 150 150 150 111 150第112 151 151 151112 151页q 113 152 152、152、113和152114 153 153 114 153第115 162 162 1621 115 162页电话:116 163 163 163 163 116 163u 117 164 164 167 117 164v 118 165 165 116 118 165电话:119 166 166 116 119 166x 120 167 167 167.120 167 x 120 167y 121 168 168、168、121和168z 122169169169122 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<PAD>128 32 32 32 194.128 32<HOP>129 33 33 33 194.129 33<前列腺增生>130 34 34 34 194.130 34<NBH>131 35 35 35 194.131 35<印度>132 36 36 36 194.132 36<NEL>133 21 37 37 194.133 37美国国家标准**<SSA>134 6 6 6 194.134 6<欧空局>135 23 23 23 194.135 23<HTS>136 40 40 40 194.136 40<HTJ>137 41 41 41 194.137 41<悉尼威立雅运输公司>138 42 42 42 194.138 42<PLD>139 43 43 43 194.139 43<PLU>140 44 44 44 194.140 44<RI>141 9 9 9 194.141 9<SS2>142 10 10 194.142 10<SS3>143 27 27 194.143 27<分布式控制系统>144 48 48 48 194.144 48<PU1>145 49 49 49 194.145 49<PU2>146 26 26 26 194.146 26<STS>147 51 51 51 194.147 51<CCH>148 52 52 52 194.148 52<兆瓦>149 53 53 53 194.149 53<SPA>150 54 54 54 194.150 54<美国环保局>151 8 8 194.151 8<SOS>152 56 56 56 194.152 56<SGC>153 57 57 57 194.153 57<SCI>154 58 58 58 194.154 58<犯罪现场调查>155 59 59 59 194.155 59<ST>156 4 4 194.156 4<OSC>157 20 20 20 194.157 20<下午>158 62 62 62 194.158 62<APC>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 117 194.163 128.68<货币符号>164 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 81194.167 128.72<迪亚雷斯>168 189 187 121 194.168 128.73**##<版权标志>169 180 180 180 194.169 128.74<女性ORDINAL>170 154 154 154194.170 128.81<指向左GUILLEMET>171 138 138 194.171 128.82<未签署>172 95 176 186 194.172 128.83**##<软HYPHEN>173 202 202 201 194.173 128.84<注册商标>174 175 175 194.174 128.85<麦克龙>175 188 188 161 194.175 128.86##<学位标志>176 144 144 114 194.176 128.87<加上或最小标志>177 143 143 194.177 128.88<超级脚本二>178 234 234 233 194.178 128.89<超级脚本三>179 250 250 250 194.179 128.98<急性发作>180 190 190 190190 194.180 128.99<微型标志>181 160 160 160 194.181 128.100<段落标志>182 182 182182 194.182 128.101<中点>183 179 179 149.183 128.102<塞迪拉>184 157 157 194.184 128.103<超级脚本一>185 218 218 217 194.185 128.104<MASC。订单指示符>186 155 155 156 194.186 128.105<指向右侧GUILLEMET>187 139 139 194.187 128.106<分数四分之一>188 183 183 194.188 128.112<分数一半>189 184 184 194.189 128.113<分数四分之三>190 185 185 194.190 128.114<倒置问号>191 171 171 171 194.191 128.115<A带GRAVE>192 100 100 100 195.128 138.65<A急性>193 101 101 101 195.129 138.66<A带CIRCUMFLEX>194 98 98 98 195.130 138.67<A瓷砖>195 102 102 102 195.131 138.68<糖尿病>196 99 99 99 195.132 138.69<A,上面有环>197 103 103 195.133 138.70<资本负债AE>198 158 158 195.134 138.71<C与塞迪拉>199 104 104 104 195.135 138.72<有草>200 116 116 116195.136 138.73<急症>201 113 113 113195.137 138.74<带扬抑符的E>202 114 114 114 195.138 138.81<E带分音符>203 115 115 115 195.139 138.82<我有草>204 120 120 120 195.140 138.83<I急性>205 117 117 118 195.141 138.84<I WITH CIRCUMFLEX>206 118 118 119 195.142 138.85<糖尿病>207 119 119 119119 195.143 138.86<大写字母ETH>208 172 172 195.144 138.87<N,倾斜>209 105 105 105 195.145 138.88<带草>210 237 237 236 195.146 138.89<O急性>211 238 238 239 195.147 138.98<O带CIRCUMFLEX>212 235 235 195.148 138.99<O带瓷砖>213 239 239 238 195.149 138.100<O伴有腹泻>214 236 236 239 195.150 138.101<乘法符号>215 191 191 191195.151 138.102<O带冲程>216 128 128 128 195.152 138.103<U WITH GRAVE>217 253 253 224 195.153 138.104(带GRAVE的U)##<U急性>218 254 254 255 195.154 138.105<带CIRCUMFLEX的U>219 251 251 221 195.155 138.106##<糖尿病>220 252 252 251 195.156 138.112<Y急性>221 173 186 173 195.157 138.113**##<大写字母THORN>222 174 174 174195.158 138.114<小写字母尖S>223 89 89 89 195.159 138.115<a有草>224 68 68 68 195.160 139.65<a急性>225 69 69 69 195.161 139.66<a带CIRCUMFLEX>226 66 66 66 195.162 139.67<a瓷砖>227 70 70 70 195.163 139.68<a腹泻>228 67 67 67 67 195.164 139.69<a上面有环>229 71 71 71 195.165 139.70<小配饰ae>230 156 156 156195.166 139.71<c与塞迪拉>231 72 72 72 195.167 139.72<带GRAVE>232 84 84 84 195.168 139.73<e急性>233 81 81 81 81 195.169 139.74<使用CIRCUMFLEX>234 82 82 82 195.170 139.81<糖尿病>235 83 83 83 195.171 139.82<i有草>236 88 88 88 195.172 139.83<i急性>237 85 85 85 195.173 139.84<i带CIRCUMFLEX>238 86 86 195.174 139.85<i腹泻>239 87 87 87 195.175 139.86<小写字母eth>240 140 140 195.176 139.87<n带瓷砖>241 73 73 195.177 139.88<o带GRAVE>242 205 205 205195.178 139.89<o急性>243 206 206 206195.179 139.98<o带CIRCUMFLEX>244 203 203 193 195.180 139.99<o瓷砖>245 207 207 208 195.181 139.100<无腹泻>246 204 204 204195.182 139.101<分割标志>247 225 225 225195.183 139.102<o有冲程>248 112 112 112 195.184 139.103<u带GRAVE>249 221 221 192 195.185 139.104##<u急性>250 222 222 2222 195.186 139.105<u带CIRCUMFLEX>251 219 219 195.187 139.106<u伴有腹泻>252 220 220 195.188 139.112<y急性>253 141 141 141195.189 139.113<小写字母刺>254 142 142 142195.190 139.114<y伴有腹泻>255 223 223 222 195.191 139.115

如果您希望以CCSID 0037的顺序而不是ASCII+拉丁语-1的顺序查看上表,请运行该表:

配方4
珍珠\-ne'如果(/.{29}\d{1,3}\s{2,4}\d}1,3}\s{2,4neneneep \d{2,3}\s[2,4}\s}2,4}\d{1,3}/)'\-e“{push(@l,$_)}”\-e'结束{打印地图{$_->[0]}'\-e“排序{$a->[1]<=>$b->[1]}”\-e'映射{[$_,substr($_,34,3)]}@l;}'perlebcdic.pod文件

如果您希望以CCSID 1047顺序查看,请将最后一行中的数字34更改为39,如下所示:

配方5
perl语言\-ne'如果(/.{29}\d{1,3}\s{2,4}\d}1,3}\s{2,4neneneep \d{2,3}\s[2,4}\s}2,4}\d{1,3}/)'\-e“{push(@l,$_)}”\-e'结束{打印地图{$_->[0]}'\-e“排序{$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,4neneneep \d{2,3}\s[2,4}\s}2,4}\d{1,3}/)'\-e“{推(@l,$_)}”\-e“结束{打印地图{$_->[0]}”\-e“排序{$a->[1]<=>$b->[1]}”\-e'映射{[$,substr($,44,3)]}@l;}'perlebcdic.pod文件

十六进制表,按1047顺序排序

自本文档首次编写以来,越来越多的约定是使用十六进制表示法表示代码点。对食谱进行排序是一个多步骤的过程,为了方便起见,这里是上面的表,按照代码页1047的顺序重新排序,并使用十六进制表示法。

国际标准化组织8859-1销售点-CCSIDCCSID CCSID九CCSID-1047chr 0819 0037 1047 BC UTF-8 UTF-EBCDIC---------------------------------------------------------------------<NUL>00 00 00 00<SOH>01 01 01 01<STX>02 02 02 02<ETX>03 03 03 03<ST>9C 04 04 C2.9C 04<HT>09 05 05 05 05 09 05<SSA>86 06 06 06 C2.86 06<戴尔>7楼07 07 07 7楼07<美国环保局>97 08 08 08 C2.97 08<RI>8D 09 09 C2.8D 09<SS2>8E 0A 0A 0C 2.8E 0A<VT>0B0B0B 0B0B10B 0B<FF>0C 0C<CR>0D 0D 0C 0D 0T 0D<SO>0E 0E 0E-0E 0E0E<SI>0F 0F 0F 0F 0F 0F 0F<DLE>10 10 10 10<DC1>11 11 11 11<DC2>12 12 12 12<DC3>13 13 13 13<OSC>9D 14 14 C2.9D 14<左前>0A 25 15 15 0A 15**<BS>08 16 16 16 08 16<欧空局>87 17 17 17 C2.87 17<加拿大>18 18 18 18<EOM>19 19 19 19<PU2>92 1A 1A C2.92 1A<SS3>8F 1B 1B 1B C2.8F 1B<FS>1C 1C<GS>1D1D 1D 1D<RS>1E 1E<美国>1F 1F 1F-1F-1F<PAD>80 20 20 20 C2.80 20<HOP>81 21 21 21 C2.81 21<前列腺增生>82 22 22 22 C2.82 22<NBH>83 23 23 23 C2.83 23<印度>84 24 24 24 C2.84 24<NEL>85 15 25 25 C2.85 25**<欧洲贸易壁垒>17 26 26 26 17 26<ESC>1B 27 27 1B 27<高温超导>88 28 28 28 C2.88 28<HTJ>89 29 29 29 C2.89 29<悉尼威立雅运输公司>8A 2A 2A C2.8A 2A<PLD>8B 2B 2B C2.8B 2B<PLU>8C 2C 2C C2.8C 2C<ENQ>05 2D 2D 05 2D<确认>06 2E 2E 6E 2E<贝尔>07 2F 2F 2V 07 2F<分布式控制系统>90 30 30 30 C2.90 30<PU1>91 31 31 31 C2.91 31<同步>16 32 32 32 32 16 32<STS>93 33 33 C2.93 33<CCH>94 34 34 34 C2.94 34<MW>95 35 35 35 C2.95 35<SPA>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<SCI>9A 3A 3A 3AC2.9A 3A<CSI>9B 3B 3B 3 B C2.9B 3B<DC4>14 3C 3C 14 3C<NAK>15 3D 3D 15 3D<项目经理>9E 3E 3E C2.9E 3E<SUB>1A 3F 3F 3F1A 3F<空格>20 40 40 40 40 20 40<非断裂空间>A0 41 41 41 C2.A0 80.41<a带CIRCUMFLEX>E2 42 42 C3.A2 8B.43<a腹泻>E4 43 43 43 C3.A4 8B.45<带格栅>E0 44 44 44 C3.A0 8B.41<a急性>E1 45 45 45 C3.A1 8B.42<a带瓷砖>E3 46 46 46 C3.A3 8B.44<a上面有环>E5 47 47 47 C3.A5 8B.46<c含塞迪拉>E7 48 48 48 48 C3.A7 8B.48<n带瓷砖>F1 49 49 49 C3.B1 8B.58<中央标志>A2 4A 4A B0 C2.A2 80.43##.2E 4B 4B 4B2E 4B<3摄氏度(28 4D 4D 28 4D+E E E E|7C4F4F4F7C4F&                           26   50   50   50   26       50<e急性>E9 51 51 51 C3.A9 8B.4A<e带CIRCUMFLEX>EA 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<i带CIRCUMFLEX>EE 56 56 56 C3.AE 8B.55<i腹泻>EF 57 57 57 C3.AF 8B.56<带草>EC 58 58 58 C3.AC 8B.53<小写字母尖S>DF 59 59 C3.9F 8A.73!                           21 5A 5A 5A 21 5A2450亿美元50亿美元24 50亿美元*2安培5摄氏度5摄氏度2安培5华氏度)29 5D 5D 29 5D;                           3B 5E 5E 5B 5E^5E B0 5F 6A 5E 5F**##-二维60 60二维60/二楼61 61二楼61<A带CIRCUMFLEX>C2 62 62 C3.82 8A.43<糖尿病>C4 63 63 63 C3.84 8A.45<带格栅>C0 64 64 64 C3.80 8A.41<A急性>C1 65 65 65 C3.81 8A.42<A带波浪号>C3 66 66 C3.83 8A.44<A,环上方>C5 67 67 67 C3.85 8A.46<C与塞迪拉>C7 68 68 68 C3.87 8A.48<N带瓷砖>D1 69 69 69 C3.91 8A.58<断条>A6 6A 6A D0 C2.A6 80.47##,2C6B 6B 6B 2C 6B%256C 6C 6C 25 6C_5F 6D 6D 6D 5F 6D>3E6E6E3E6E?                           三楼六楼六楼六楼三楼六楼<o带冲程>F8 70 70 70 C3.B8 8B.67<E急性>C9 71 71 71 C3.89 8A.4A<带CIRCUMFLEX的E>CA 72 72 72 C3.8A 8A.51<糖尿病>CB 73 73 73 C3.8B 8A.52<E带草>C8 74 74 74 C3.88 8A.49<I急性>CD 75 75 75 C3.8D 8A.54<I带CIRCUMFLEX>CE 76 76 76 C3.8E 8A.55<糖尿病>CF 77 77 77 C3.8F 8A.56<I带草>CC 78 78 78 C3.8C 8A.53`60 79 79 4A 60 79##:3A 7 A 7A 7A 3A 7A#23 7B 7B 7B23 7B@40 7C 7C 7C40 7C'27 7D 7D 7D27 7D=3D7E7E7E 3D7E“22 7英尺7英尺7英尺22 7英尺<O带冲程>D8 80 80 80 C3.98 8A.67a 61 81 81 81 61 81b 62 82 82 82 62 82c 63 83 83 83 63 83电话电话:64 84 84 84 64 84电子65 85 85 85 65 85传真:66 86 86 66 86g 67 87 87 87 67 87克电话68 88 88 88 68 88i 69 89 89 89 69 89<左指剪切仪>AB 8A 8A C2.AB 80.52<右向剪切仪>BB 8B 8B 8B C2.BB 80.6A<小写字母eth>F0 8C 8C 8C C3.B0 8B.57<y急性>FD 8D 8D 8C 3.BD 8B.71<小写字母刺>FE 8E 8E 8C 3.BE 8B.72<附加或最小标志>B1 8F 8F C2.B1 80.58<学位标志>B0 90 90 90 C2.B0 80.57j 6A 91 91 91 6A 91号k 6B 92 92 92 6B 92电话l 6C 93 93 93 6C 93米6D 94 94 94 6D 94n 6E 95 95 95 6E 95o 6F 96 96 96 6F 96第70 97 97 97 70 97页问71 98 98 98 71 98电话:72 99 99 99 72 99<女性ORDINAL>AA 9A 9A C2.AA 80.51<MASC。顺序指示符>BA 9B 9B 9C 2.BA 80.69<小配体ae>E6 9C 9C 9C C3.A6 8B.47<塞迪拉>B8 9D 9D C2.B8 80.67<资本负债AE>C6 9E 9E 9C 3.86 8A.47<货币符号>A4 9F 9F C2.A4 80.45<微型标志>B5 A0 A0 A0C2.B5 80.64~7E A1 A1 FF 7E A1##s 73 A2 A2 73 A2t 74 A3 A3 74 A3u 75 A4 A4 A4 75 A4v 76 A5 A5 76 A5带77 A6 A6 A六77 A6x 78 A7 A7 A70 78 A7y 79 A8 A8 A80 79 A8年z 7A A9 A9 A9A A9<倒置“!”>A1 AA AA C2.A1 80.42<反向问号>BF AB AB C2.BF 80.73<大写字母ETH>D0 AC AC C3.90 8A.57[5B BA AD BB 5B AD**##<大写字母THORN>DE AE AE C3.9E 8A.72<注册商标>AE 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 C2.A5 80.46<中点>B7 B3 B3 B3C2.B7 80.66<版权标志>A9 B4 B4 B4C2.A9 80.4A<剖面标志>A7 B5 B5 B5C2.A7 80.48<段落标志>B6 B6 B六B6 C2.B6 80.65<分数四分之一>BC B7 B7 B7C2.BC 80.70<分数一半>BD B8 B8 B8C2.BD 80.71<分数四分之三>BE B9 B9 C2.BE 80.72<急性Y>DD AD BA AD C3.9D 8A.71**##<糖尿病>A8 BD BB 79 C2.A8 80.49**##<MACRON>AF BC BC A1 C2.AF 80.56##]5D BB BD BD 5D BD**<急性反应>B4 BE BE C2.B4 80.63<乘法符号>D7 BF BF C3.97 8A.66{7B C0 C0 FB 7B CO2##A 41 C1 C1 C1 41 C1B 42 C2 C2 42 C2C43 C3 C3 C343 C3D 44 C4 C4 44 C4东经45 C5 C5 C545 C5传真46 C6 C6 C646 C6G 47 C7 C7 C7-47 C7H 48 C8 C8 C八C8 48 C8I 49 C9 C9 C九49 C9<软连字符>AD CA CA CA C2.AD 80.54<o带CIRCUMFLEX>F4 CB CB C3.B4 8B.63<无糖尿病>F6 CC CC C3.B6 8B.65<o带GRAVE>F2 CD CD C3.B2 8B.59<o急性>F3 CE CE CE C3.B3 8B.62<o带瓷砖>F5 CF CF C3.B5 8B.64}7D D0 D0 FD 7D D0##J 4A D1 D1 4 A D1K 4B D2 D2 D24 B D2L 4C D3 D3 D4 C D3M 4D D4 D4 D4D D4DN 4E D5 D5 D5 4E D5O 4F D6 D6 D6 4F D6电话:50 D7 D7 D70 50 D7问51 D8 D8 D80 51 D8R 52 D9 D9 D95 D9 52 D9<超级脚本一>B9 DA DA C2.B9 80.68<u带CIRCUMFLEX>FB DB DB C3.BB 8B.6A<u带透析>FC DC DC C3.BC 8B.70<u带草>F9 DD DD C0 C3.B9 8B.68##<u急性>前桥DE DE C3.BA 8B.69<y伴糖尿病>FF DF DF C3.BF 8B.73\5C E0 E0不列颠哥伦比亚省##<分区标志>F7 E1 E1 C3.B7 8B.66S 53 E2 E2 53 E2电话54 E3 E3 E5 54 E3U 55 E4 E4 E4-55 E4V 56 E5 E5 E五E5 56 E5宽57 E6 E6 E5 57 E6X 58 E7 E7 E7-58 E7Y 59 E8 E8 E80 59 E8Z 5A E9 E9 E9A E9<超级脚本二>B2 EA EA C2.B2 80.59<O带CIRCUMFLEX>D4 EB EB C3.94 8A.63<O伴有腹泻>D6 EC EC C3.96 8A.65<O带草>D2 ED ED C3.92 8A.59<O急性>D3 EE EE EE C3.93 8A.62<O带倾斜>D5 EF EF C3.95 8A.640 30 F0 F0 F0 30 F01楼31层1楼31楼2 32楼2层32楼233楼3楼33楼34 34楼4楼4楼34楼5 35楼5楼5楼35楼56 36楼6楼6楼36楼67 37楼7楼37楼78 38 F8 F8 F8-38 F89 39楼9楼9楼39楼9<超级脚本三>B3 FA FA C2.B3 80.62<U带扬抑符>DB FB FB DD C3.9B 8A.6A##<U带分音符>DC FC FC C3.9C 8A.70<U带格栅>D9 FD FD E0 C3.99 8A.68##<U急性>DA FE FE C3.9A 8A.69<APC>9F FF FF 5F C2.9F FF##

识别字符代码集

可以确定在哪个字符集下操作。但首先你需要真正确定你需要这样做。如果您不必测试字符集并根据需要执行不同的操作,那么您的代码将更简单,并且可能也同样具有可移植性。实际上,只有极少数情况下不容易编写可移植到所有字符集的直线代码。请参见perluniintro中的“Unicode和EBCDIC”了解如何可移植地指定字符。

但在某些情况下,您可能想知道运行的是哪个字符集。一个可能的例子是排序在性能至关重要的内部循环中。

要确定是在ASCII还是EBCDIC下运行,可以使用订单()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=单词('[')==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平台)上,第二个$是_科学测试会给那里带来麻烦。

要确定perl是否是在EBCDIC代码页下构建的,可以使用Config模块,如下所示:

使用配置;$is_ebcdic=$Config{'ebcdic'}eq'define';

转换

utf8::unicode _ to_native()utf8::native_to_unicode()

这些函数在一种编码中获取一个输入数字代码点,并返回另一种编码的等效值。

请参见utf8接口.

信托收据///

为了将一个字符串从一个字符集转换为另一个字符,需要一个简单的数字列表,例如上表中的右列,以及Perl的信托收据///只需要操作员。表中的数据按ASCII/Latin1顺序排列,因此EBCDIC列提供了易于使用的ASCII/Latin1到EBCDIC操作,这些操作也很容易颠倒。

例如,要将ASCII/Latin1转换为代码页037,从配方2的输出中获取第二个数字列的输出(修改为添加"\"字符),并在中使用信托收据///如此:

$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\x5C\x4E\x6B\x60\x4B\x61”。“\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\x7A\x5E\x4C\x7E\x6E\x5F”。“\x7C\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xD1\xD2\xD3\xD4\xD5\xD6”。“\xD7\xD8\xD9\xE2\xE3\xE4\xE5\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\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\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上,请参阅图标(1)手册页。调用图标(iconv)perl中的shell实用程序将是:

#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上的模块。

C RTL公司

OS/390和z/OS C运行时库提供_阿托()_etoa()功能。

操作员差异

这个..范围运算符在EBCDIC平台上小心处理某些字符范围。例如,以下数组在EBCDIC平台或ASCII平台上将有26个元素:

@字母=('A'..'Z');#$#字母==25

在EBCDIC平台上运行的Perl程序中,对字符串或字符数据进行操作时,位运算符(如&^|)可能会返回与在ASCII平台上运行时不同的结果。下面是一个改编自珍珠岩:

#基于EBCDIC的示例打印“j p \n”^“a h”;#打印“日本\n”打印“JA”|“ph\n”;#打印“japh\n”打印“JAPH\nJunk”&“\277\277/277\277\ 277”;#打印“japh\n”;打印“p N$”^“E<H \N”;#打印“Perl\n”;

ASCII表中32个C0控制字符的一个有趣特性是,它们可以在Perl中“按字面”构造为控制字符,例如。(chr(0)当量\c(c)@)>(chr(1)当量\cA公司)>等。EBCDIC平台上的Perl已被移植为\c(c)@chr(0)\cA公司chr(1)等,但结果的字符取决于您使用的代码页。下表使用控件的标准首字母缩写词。POSIX-BC和1047集合在整个范围内是相同的,与0037集合只有一个点不同(21位小数)。请注意,行终止符可以由\cJ公司在ASCII平台上,但通过\中央控制单元在1047或POSIX-BC平台上,并且不能作为“\c.letter。”0037平台上的控制字符。另请注意\c(c)\不能是字符串或正则表达式中的最后一个元素,因为它将吸收终止符。但是\c(c)\X(X)是一个文件分离器与连接X(X)对所有人来说X(X).异常值\c?基于ASCII,生成非C0控件DEL公司,生成离群值控件空气污染指数在EBCDIC上,不在连续控件块中的控件。请注意,这其中的一个微妙之处在于\c?在ASCII平台上是ASCII字符,而它不等同于EBCDIC平台中的任何ASCII字符。

chr ord 8859-1 0037 1047和POSIX-BC-----------------------------------------------------------------------\c@0<NUL><NUL>\cA1<SOH><SOH>\cB 2<STX><STX\cC3\cD 4<EOT><ST><ST>\cE 5<ENQ><HT><HT>\cF 6<确认><SSA><SSA>\cG 7<贝尔><戴尔><戴尔\cH 8<BS><EPA><EPA>\cI 9<HT><RI>\cJ 10<LF><SS2><SS2>\cK 11\cL 12<FF><FF><FF>\cM 13<CR><CR>\cN 14<SO><SO><SO>\cO 15<SI><SI>\cP 16\cQ 17\cR 18\cS 19\cT 20<DC4><OSC><OSC>\cU 21<NAK><NEL><LF>**\cV 22<同步><BS><BS\cW 23<ETB><ESA><ESA>\cX 24<CAN><CAN>\cY 25<EOM><EOM>\cZ 26<SUB><PU2><PU2>\c[27<ESC><SS3><SS3\c\X 28<FS>X<FS>X<FS>\c] 29<GS><GS><GS>\c ^30<RS><RS>\c_31<美国><美国>\c?*<DEL><APC><APC>

*注:\c?映射到序号127(DEL公司)在ASCII平台上,但由于序号127在EBCDIC机器上不是控制字符,\c?而是将它们映射到空气污染指数在0037和1047中为255,在POSIX-BC中为95。

功能差异

chr()

chr()必须给一个EBCDIC编码参数,才能在EBCDIC平台上生成所需的字符返回值。例如:

$CAPITAL_LETTER_A=chr(193);
订单()

订单()将在EBCDIC平台上返回EBCDIC代码值。例如:

$the_number_193=单词(“A”);
包装()

这个“c”“C”模板包装()取决于字符集编码。EBCDIC上的用法示例包括:

$foo=包(“CCCC”,193194195196);#$foo eq“ABCD”$foo=包(“C4”,193194195196);#同样的事情$foo=包(“ccxxcc”,193194195196);#$foo eq“AB\0\0CD”

这个“U”模板在所有平台上都被移植为“Unicode”,因此

包装(“U”,65)eq“A”

在所有平台上都是如此。如果需要低256的本机代码点,请使用“W”模板。这意味着等价物

pack(“W”,ord($字符))等于$字符解压缩(“W”,$character)==ord$字符

将保持不变。

打印()

对于传递给打印的包含ASCII编码的标量和字符串,必须小心。发生这种情况的一个常见位置是用于CGI脚本编写的MIME类型头的输出。例如,许多Perl编程指南都推荐类似以下内容:

打印“Content-type:\text/html\015\012\015\012”;#这在EBCDIC上可能是错误的

你可以改为写

print“Content-type:\ttext/html\r\n\r\n”;#DGW等人同意

并使其便携工作。

这是因为在这种情况下,从EBCDIC到ASCII的转换是由web服务器完成的。有关详细信息,请参阅web服务器的文档。

打印()

在EBCDIC平台上执行时,可以将字符转换为数字,反之亦然的格式与ASCII格式不同。示例包括:

printf(“%c%c%c”,193194195);#打印ABC
排序()

EBCDIC排序结果可能与ASCII排序结果不同,特别是对于混合大小写字符串。我们将对此进行更详细的讨论在下面.

冲刺()

请参阅的讨论“打印()”以上。使用sprintf的一个例子是:

$CAPITAL_LETTER_A=冲刺(“%c”,193);
解压缩()

请参阅的讨论“打包()”以上。

请注意,通过以Unicode数字指定内容并使用转换函数,可以为这些内容编写可移植代码:

printf(“%c”,utf8::unicode_to_native(65));#全部打印A#平台print utf8::native_to_unicode(ord(“A”));#同样,打印65

请参见perluniintro中的“Unicode和EBCDIC”“转换”用于其他选项。

常规表达差异

您可以像ASCII平台上的人一样编写正则表达式。但请记住,使用八进制或十六进制表示法来指定特定的代码点会给您提供EBCDIC代码页本机映射到它的字符。(所有双引号字符串也是如此。)如果要可移植地编写,只需使用\N{U+…}在任何地方都可以使用符号\x{…},不要使用八进制符号。

从Perl v5.22开始,这适用于括号字符类中的范围。例如,如果你说,qr/[\N{U+20}-\N{U+7F}]/,表示字符\N{U+20},\北{北+21}, ...,\北{北+7F}。此范围是ASCII字符集包含的所有可打印字符。

在v5.22之前,除了(从Perl v5.5.3开始)【A-Z】[a-z]范围是专门编码的,以避免拾取间隙字符。例如,诸如“o”之类的字符(o使用CIRCUMFLEX)位于“I”和“J”之间的值将与正则表达式范围不匹配/【H-K】/。但是,如果其中一个范围端点显式为数字(并且两者都不是由指定的)\N{U+…}),将匹配间隙字符:

/[\x89-\x91]/

将匹配\x8e(x8e)尽管如此\x89像素是“i”并且\x91像素为“j”,并且\x8e(x8e)从字母的角度来看,是一个间隙字符。

另一个需要注意的构造是十六进制的不正确使用(除非您使用\N{U+…})或正则表达式中的八进制常量。考虑以下一组短节:

子is_c0{my$char=substr(移位,0,1);$char=~/[\000-\037]/;}子is_print_ascii{my$char=子项(移位,0,1);$char=~/[\040-\176]/;}子is_delete{my$char=子项(移位,0,1);$char eq“\177”;}子is_c1{my$char=子项(移位,0,1);$char=~/[\200-\237]/;}子is_latin_1{#但不是ASCII;不是C1my$char=substr(移位,0,1);$char=~/[\240-\377]/;}

这些仅在ASCII平台上有效。从Perl v5.22开始,只需将八进制常量更改为等效常量\N{U+…}值使其可移植:

子is_c0{my$char=子项(移位,0,1);$char=~/[\N{U+00}-\N{U+1F}]/;}子is_print_ascii{my$char=子项(移位,0,1);$char=~/[\N{U+20}-\N{U+7E}]/;}子is_delete{my$char=子项(移位,0,1);$char eq“\N{U+7F}”;}子is_c1{my$char=子项(移位,0,1);$char=~/[\N{U+80}-\N{U+9F}]/;}sub is_latin_1{#但不是ASCII;不是C1my$char=子项(移位,0,1);$char=~/[\N{U+A0}-\N{U+FF}]/;}

下面是一些替代的可移植方法来编写它们:

子Is_c0{my$char=子项(移位,0,1);返回$char=~/[[:cntrl:]]/a&&!Is_delete($char);#或者:#返回$char=~/[[:cntrl:]]/#&&$char=~/[[:ascii:]]/#        && ! Is_delete($char);}子Is_print_ascii{my$char=子项(移位,0,1);return$char=~/[[:print:]]/a;#或者:#return$char=~/[[:print:]]/&&$char==~/[:ascii:]]/;#或者#返回$char#=~/[!“\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\]^_`A-Z{|}~]/;}子Is_delete{my$char=子项(移位,0,1);返回utf8::native_to_unicode(ord$char)==0x7F;}子Is_c1{使用功能“unicode字符串”;my$char=子项(移位,0,1);返回$char=~/[[:cntrl:]]/&$char!~/[[:ascii:]]/;}sub Is_latin_1{#但不是ASCII;不是C1使用功能“unicode字符串”;my$char=子项(移位,0,1);返回ord($char)<256&&$char!~/[[:ascii:]]/&&$char!~/[[:cntrl:]]/;}

另一种写作方式Is_latin_1()将显式使用范围中的字符:

子Is_latin_1{my$char=子项(移位,0,1);$char=~/[¡°¡°¡±¡°¡¨¡±¡±¡¤¡°¡¤£©¡°[尼日尔-奥古努苏]/x;}

尽管这种形式在网络传输中(由于存在8位字符)或在非ISO-Latin字符集上可能会遇到问题。但它确实允许Is_c1(_C)被重写,以便在没有'unicode字符串'(早于v5.14):

sub Is_latin_1{#但不是ASCII;不是C1my$char=子项(移位,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=排序(qw(Dr.Dr.));#@ASCII的排序保留('Dr.','Dr.'),#但是('dr.','dr.')在EBCDIC上

EBCDIC中大写字母前小写的属性甚至被带到拉丁语1 EBCDIC页面,如0037和1047。例如“Ë”(E有腹泻,203)位于“the”之前(e有腹泻,235),但在EBCDIC平台上,后者(83)位于前者(115)之前。(敏锐的读者会注意到大写的“ß”小字母尖S是简单的“SS”,大写形式的“”(小y与腹泻)和“µ”(微型标志)不在0..255范围内,但在启用Unicode的Perl中使用Unicode)。

排序顺序将导致ASCII平台与EBCDIC平台上获得的结果之间的差异。以下是关于如何处理这些差异的一些建议。

忽略ASCII与EBCDIC排序差异。

这是计算成本最低的策略。它可能需要一些用户教育。

使用排序助手函数

这是完全通用的,但却是计算成本最高的策略。为每次排序比较选择一个或另一个字符集并转换为该字符集。下面是一个转换为ASCII排序顺序的完整示例:

sub-native_to_uni($){my$string=移位;#在ASCII平台上节省时间如果ord'A'==65,则返回$string;my$output=“”;对于我的$i(0..长度($string)-1){$输出.=chr(utf8::native_to_unicode(ord(substr($string,$i,1)));}#保留输入到输出的utf8ness,即使它不需要#将为utf8如果utf8::is_utf8($string),则为utf8::upgrade($output);返回$output;}sub-ascii_order{#排序助手返回native_to_uni($a)cmp native_to-uni($b);}排序ascii_order@list;

MONO CASE然后对数据进行排序(对于非数字、非下划线)

如果您不关心数字和下划线的排序位置,可以这样做

subcase_insensitive_order{#排序助手返回lc($a)cmp-lc($b)}排序case_insitive_order@list;

如果性能是一个问题,并且您不关心输出是否与输入相同,请使用信托收据///转换为数据中最常用的案例。如果数据主要是大写非拉丁1,则应用tr/[a-z]/[a-z]/,然后排序()。如果数据主要是小写非拉丁语1,则应用tr/[A-Z]/[A-Z]/在排序之前。如果数据主要为大写,并且包含拉丁语-1字符,则适用:

tr/[a-z]/[a-z]/;tr/[ááässaterie eiether eiþðñnouoóoheöounchousuüৰ]/[৭;秒/秒/克;

然后排序()。如果您有选择,最好将内容小写,以避免大写字母不在拉丁语1中的两个拉丁语1字符的问题:“ue”(小写y与腹泻)和“µ”(微型标志). 如果你确实需要大写,你可以;使用支持Unicode的Perl,请执行以下操作:

tr/ï/\x{178}/;tr/µ/\x{39C}/;

仅在一种类型的平台上进行分拣。

此策略可以使用网络连接。因此,计算成本很高。

转换格式

有多种方法可以使用字符集内映射来转换数据,以满足各种用途。上一节讨论了排序,接下来讨论了其他一些更流行的映射技术。

URL解码和编码

请注意,一些URL中有十六进制ASCII代码点,以试图克服字符或协议限制问题。例如,并不是每个键盘上都有波浪号字符,因此会出现以下形式的URL:

网址:http://www.pvhp.com/~pvhp/

也可以表示为:

http://www.pvhp.com/%7Epvhp/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::unicodeto_native(十六进制($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个模板到包装()解压缩()将以EBCDIC字符表示的EBCDIC数据等效于其ASCII对应字符。例如,以下内容将在ASCII或EBCDIC计算机上打印“确实是”:

$all_byte_chrs='';对于(0..255){$all_byte_chrs.=chr($_);}$uuencode_byte_chrs=包('u',$all_byte.chrs);($uu=<<'ENDOFFHEREDOC')=~s/^\s*//gm;M``$“`P0%!@<(”0H+#`T.#Q`1$A,4%187&!D:&QP=AA\@(2(C)“4F)R@I*BLLM+2XO,#$R,S0U-C<X.3H[/#T^/T!!0D-$149'2$E*2TQ-3D]045)35%565UA9M6EM<75岁?8&%B8V1E9F=H:6IK&联合国;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;*SMM+6VM[BYNKN\O;Z_P,'“P\3%QL?(R<K+S,W.S]#1TM/4U=;7V-G:V]S=WM_@?十> +CY.7FY^CIZNOL[>[O\/'R\_3U]O?X ^?K[_/W^_P``ENDOFFEREDOC公司if($uuencode_byte_chrs等于$uu){打印“是”;}$uudecode_byte_chrs=解压缩('u',$uuencode_byte _chrs);if($uudecode_byte_chrs等于$all_byte-chrs){打印“确实\n”;}

下面是一个非常简单的uudecoder,它将在EBCDIC上工作:

#!/usr/local/bin/perl$_=<>直到($mode,$file)=/^begin\s*(\d*)\s*(\s*)/;如果$file ne“”,则打开(OUT,“>$file”);同时(<>){最后一个if/^结束/;下一个if/[a-z]/;next除非int((((utf8::native_to_unicode(ord())-32)&077)+ 2) / 3)==int(length()/4);打印OUT unpack(“u”,$_);}关闭(OUT);chmod oct($mode),$file;

引用的可打印编码和解码

在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/([^[:打印:]$删除])/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解码器看起来有点像:

$string=~s/=([[:xdigit:][:xdiagit:])/chr-utf8::native_to_unicode(十六进制$1)/xge;$string=~s/=[\n\r]+$//;

凯撒密码

将字母表中的一个或多个字符移位进行加密的做法可以追溯到数千年前,盖乌斯·朱利叶斯·凯撒(Gaius Julius Caesar)在其高卢之战文本。单个字母移位有时被称为旋转,移位量在字符串“rot”或“rot$n”之后以数字$n表示。Rot0和rot26将在拉丁字母表的26位英文版本上指定身份图。Rot13有一个有趣的特性,即后续的替代调用是身份映射(因此,在26个字母循环组中,Rot13是它自己的非平凡逆)。因此,以下是将在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和L10N

即使在EBCDIC平台上,也至少原则上支持国际化(I18N)和本地化(L10N)。细节取决于系统,并在“操作系统问题”第节。

多角色字符集

Perl使用UTF-EBCDIC,这是一种多字节编码。在早于v5.22的Perls中,这方面可能存在各种错误。

旧的多字节EBCDIC代码页XXX。

操作系统问题

EBCDIC Perl程序员可能会关注一些与系统相关的问题。

操作系统/400

PASE公司

PASE环境是OS/400的运行时环境,可以在OS/400中运行为PowerPC AIX构建的可执行文件;看见珍珠400.PASE是基于ASCII的,而不是基于EBCDIC的ILE。

IFS访问

XXX。

OS/390、z/OS

Perl在Unix Systems Services或USS下运行。

信号作用

SA_SIGINFO公司可能有分段错误。

chcp公司

chcp公司支持作为shell实用程序显示和更改代码页。另请参见chcp(1).

数据集访问

对于顺序数据集访问,请尝试:

my@ds_records=`cat//DSNAME`;

或:

my@ds_records=`cat//'HLQ。DSNAME'`;

另请参阅CPAN上的OS390::Stdio模块。

图标(iconv)

图标(iconv)支持作为shell实用程序和C RTL例程。另请参见图标(1)iconv(3)手册页面。

区域设置

支持区域设置。当区域设置是另一个EBCDIC代码页时,可能会出现问题,该代码页包含一些代码页变体字符在其他位置。

目前还没有任何真正的UTF-8语言环境,尽管有些语言环境名称包含字符串“UTF-8”。

请参见珍珠岩有关区域设置的信息。L10N文件位于/usr/nls/locale.$配置{d_setlocale}'定义'在OS/390或z/OS上。

POSIX-BC?

XXX。

漏洞

另请参阅

珍珠岩,珀尔func,perlunicode码,utf8接口.

参考文献

http://std.dkuug.dk/i18n/charmaps网站

https://www.unicode网站/

https://www.unicode.org/reports/tr16/

https://www.sr-ix.com/Archive/CharCodeHist/index.html ASCII:美国信息渗透标准代码汤姆·詹宁斯,1999年9月。

Unicode标准,3.0版Unicode Consortium,Lisa Moore编辑,ISBN 0-201-61633-5,Addison Wesley Developers Press,2000年2月。

CDRA:IBM-字符数据表示体系结构-参考和注册表,IBM SC09-2190-001996年12月。

“解密字符集”,Andrea Vine,多语言计算与技术,#26第10卷第4期1999年8月/9月;ISSN 1523-0309;多语言计算公司,美国Sandpoint ID。

代码、密码和其他秘密通信Fred B.Wrixon,ISBN 1-57912-040-7,Black Dog&Leventhal Publishers,1998年。

网址:http://www.bobemer.com/P-BIT.HTM IBM-EBCDIC和P位;有史以来最大的电脑傻瓜罗伯特·贝默。

历史

2001年4月15日:将UTF-8和UTF-EBCDIC添加到主表pvhp中。

作者

彼得·普里默pvhp@best.com1999年和2000年,在Chris Leach和AndréPirard的帮助下,CCSID 0819和0037编写了这篇文章A.Pirard@ulg.ac.be以及托马斯·多纳(Thomas Dorner)提供的POSIX-BC帮助Thomas.Dorner@start.de。还要感谢Vickie Cooper、Philip Newton、William Raffloer和Joe Smith。本文件中使用的商标、注册商标、服务商标和注册服务商标是其各自所有者的财产。

现在由Perl5 Porters维护。