所有文档都指示我支持unicode,但我不认为我的请求与Unicode有任何关系。我想在单个标量的上下文中处理原始字节;我需要能够找出它的长度(以字节为单位),获取它的子串(以字节为单位),将字节写入光盘,以及通过网络。有没有一种简单的方法可以做到这一点,而不将字节视为perl中的任何编码?
修改
更明确地说,
my $data = "Perl String, unsure of encoding and don't need to know";
my @data_chunked_into_1024_bytes_each = #???
答案 0 :(得分:5)
Perl字符串在概念上是字符的字符串,它们是正32位整数,通常表示Unicode代码点。 Perl中的字节字符串只是一个字符串,其中所有字符的值都小于256。
(这是概念视图。内部表示稍微复杂一些,因为perl解释器尝试将字节字符串 - 在上述意义上 - 存储为实际字节字符串,而对包含字符的字符串使用通用UTF-8编码值为256或更高。但这是假设的对用户来说是透明的,实际上大部分是,除了一些丑陋的历史角点情况,如按位非(~
)运算符。)
至于如何将一般字符串转换为字节字符串,这实际上取决于您包含的字符串以及所谓包含的字节字符串:
如果你的字符串 是一串字节 - 例如如果你从二进制模式的文件中读取它 - 那么你不需要做任何事情。该字符串不应包含255以上的任何字符,如果存在,则该错误可能会被加密代码报告。
同样,如果您的字符串应该用ASCII或ISO-8859-1编码(分别编码Unicode的7位和8位子集)编码文本,那么您不需要这样做任何事情:任何最多255个字符都已正确编码,任何更高的值对于这些编码都无效。
如果您的输入字符串包含要在某些其他编码中编码的(Unicode)文本,则需要将字符串转换为该编码。通常的方法是使用Encode模块,如下所示:
use Encode;
my $byte_string = encode( "name of encoding", $text_string );
显然,您可以使用以下命令将字节字符串转换回相应的字符串:
use Encode;
my $text_string = decode( "name of encoding", $byte_string );
对于UTF-8编码的特殊情况,也可以使用内置的utf8::encode()
函数代替Encode::encode()
:
utf8::encode( $string );
与...基本相同:
use Encode;
$string = encode( "utf8", $string );
请注意,与Encode::encode()
不同,utf8::encode()
函数直接修改输入字符串。另请注意,上面的"utf8"
是指Perl的扩展UTF-8编码,它允许超出官方Unicode范围的值;对于严格符合标准的UTF-8编码,请将"utf-8"
与连字符(see Encode documentation for the gory details)一起使用。而且,是的,还有一个utf8::decode()
功能可以完成您所期望的功能。
答案 1 :(得分:1)
如果我理解你的问题,你想要的是打包/解包功能:http://perldoc.perl.org/functions/pack.html
答案 2 :(得分:1)
只要您的字符串不包含代码点255之上的字符,它将主要用作普通字节字符串,length
和substr
在字节上运行。此外,大多数输出函数(如print
)默认情况下会出现八位字节/字节,如果您尝试向其中添加任何其他内容,实际上会抱怨。
如果已知输出是某种编码,则可能需要对输出进行显式编码/解码,但只有在针对程序中每个有问题的部分提出另一个特定问题时才能添加更多详细信息。