domm / Perl

主要观点:在研究 Koha 中的奇怪 bug 时,需找到将字符串裁剪到特定最大长度的方法,要按字节而不是字符裁剪,因为 USMARC 格式有局限性且处理 Unicode 时会出现问题,介绍了字节与字符的区别、如何确定字符串长度、如何在有限空间中裁剪字符串及处理裁剪后可能出现的乱码等问题,并提供了相关代码和讨论链接,还对一些命令行标志进行了解释。
关键信息:

  • UTF8 用可变长度存储字母,旧格式固定长度,英语字母通常 1 字节,非英语字母如🚲占 4 字节,Perl 默认按字符计数,用length(),要按字节计数用bytes::length()
  • 裁剪字符串时,默认按字符裁剪,若要按字节裁剪用bytes::substr(),裁剪 Unicode 字符串可能出现乱码,如🚲被裁剪后可能出现�,可通过decode_utf8encode_utf8处理,还可使用Encode::FB_QUIET忽略无效字节。
  • 提供了在不同情况下裁剪字符串的代码示例,如substr("I love to ride my bicycle", 0, 20)等,以及展示从 1 到原始字符串长度的所有无半/无效字符的子字符串。
    重要细节:
  • Koha 中因存储长字符串在字节限制字段中裁剪数据导致搜索特定单词时请求崩溃,添加一个空格可解决。
  • USMARC 格式用 4 位整数存储字段大小和 5 位数字存储偏移量,存在最大尺寸限制,MARC::Record未检查实际大小会导致读取错误。
  • 命令行标志解释:-C相当于-CESL开启 UTF-8 输入输出流,-Mutf8加载utf8模块,-MEncode加载Encode
阅读 9
0 条评论