- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我希望打印的 Perl 脚本 found
执行时:
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use Encode;
use constant filename => 'Bärlauch';
open (my $out, '>', filename) or die;
close $out;
opendir(my $dir, '.') or die;
while (my $filename_read = readdir($dir)) {
# $filename_read = encode('utf8', $filename_read);
print "found\n" if $filename_read eq filename;
}
filename
的文件。 . (运行脚本后,我可以用
ls
验证文件是否存在,并且该文件不是用“funny”字符创建的。)
found
如果存在名称与刚刚创建的文件相同的文件。显然应该是这样。
LANG=en_US.UTF8
)
Barlauch
,它按预期工作并打印
found
.
$filename_read = encode('utf8', $filename_read);
不会改变行为。
最佳答案
改写的问题(按照我的解释)是:
Why doesn't
readdir
return back the newly created filename? (Here, represented by the variablefilename
which is set toBärlauch
).
filename
是一个 Perl 常量变量,所以这就是为什么它前面缺少
$
符号的原因。)
use utf8
程序开头的语句,
filename
将在编译时升级为 Unicode 字符串,因为它包含非 ASCII 字符。来自
utf8 的文档附注:
Enabling the utf8 pragma has the following effect: Bytes in the source text that are not in the ASCII character set will be treated as being part of a literal UTF-8 sequence. This includes most literals such as identifier names, string constants, and constant regular expression patterns.
The general principle is that Perl tries to keep its data as eight-bit bytes for as long as possible, but as soon as Unicodeness cannot be avoided, the data is transparently upgraded to Unicode.
...
Internally, Perl currently uses whatever the native eight-bit character set of the platform (for example Latin-1) is, defaulting to UTF-8, to encode Unicode strings.
filename
中的非 ASCII 字符是字母
ä
.如果您使用 ISO 8859-1 扩展 ASCII 编码 (Latin-1),则将其编码为字节值
0xE4
,看到这个
table在
ascii-code.com
.
ä
字符来自
filename
,它将仅包含 ASCII 字符,因此即使您使用
utf8
,它也不会在内部升级为 Unicode。语用。
filename
现在是带有内部
UTF-8
的 Unicode 字符串标志设置(有关
UTF-8
标志的更多信息,请参阅
utf8 编译指示)。注意字母
ä
以 UTF-8 编码为两个字节
0xC3 0xA4
.
filename
是一个 Unicode 字符串,它将被编码为 UTF-8。但是请注意,不必对
filename
进行编码第一个(
encode_utf8( filename )
)。见
Creating filenames with unicode characters想要查询更多的信息。因此,文件名以 UTF-8 编码字节的形式写入磁盘。
readdir
即使文件名包含以 UTF-8 编码的字节,也不返回 Unicode 字符串(设置了 UTF-8 标志的字符串)。它返回二进制或字节字符串,见
perlunitut有关字节字符串与字符 (Unicode) 字符串的讨论。
readdir
返回Unicode字符串?首先,根据
There are still many places where Unicode (in some encoding or another) could be given as arguments or received as results, or both in Perl, but it is not. (...)
The following are such interfaces. For all of these interfaces Perl currently (as of v5.16.0) simply assumes byte strings both as arguments and results. (...)
One reason that Perl does not attempt to resolve the role of Unicode in these situations is that the answers are highly dependent on the operating system and the file system(s). For example, whether filenames can be in Unicode and in exactly what kind of encoding, is not exactly a portable concept. (...)
- chdir, chmod, chown, chroot, exec, link, lstat, mkdir, rename, rmdir, - stat, symlink, truncate, unlink, utime, -X
- %ENV
- glob (aka the <*>)
- open, opendir, sysopen
- qx (aka the backtick operator), system
- readdir, readlink
readdir
返回字节字符串,因为通常不可能先验地知道文件名的编码。有关为什么这是不可能的背景信息,请参见例如:
$filename_read
使用变量
filename
:
print "found\n" if $filename_read eq filename;
$filename_read
之间的唯一区别和
filename
是
$filename_read
没有设置 UTF-8 标志(它不是 Perl 内部识别为“Unicode 字符串”的)。
eq
的结果运算符将取决于
$filename_read
中的字节是否为是否是纯 ASCII。根据
Encode 的文档模块:
Before the introduction of Unicode support in Perl, The
eq
operator just compared the strings represented by two scalars. Beginning with Perl 5.8,eq
compares two strings with simultaneous consideration of the UTF8 flag....
When you decode, the resulting UTF8 flag is on--unless you can unambiguously represent data.
eq
会考虑
UTF-8
标志自
$file_name_read
不包含纯 ASCII,因此它会
$filename_read
和
filename
其中相同且仅包含纯 ASCII 字节(并且
filename
仍然设置了 UTF-8 标志,
$filename_read
没有设置 UTF-8 标志),然后
eq
会认为两个字符串相等。参见
Encode 文档中的讨论有关此行为背景的更多信息。
readdir
返回的字节字符串来解决问题中的问题。转换为 Unicode 字符串(强制设置 UTF-8 标志):
$filename_read = Encode::decode_utf8( $filename_read );
ä
(带分音符的拉丁文小写字母 A)在
Bärlauch
.例如,
Encode::UTF8Mac
想要查询更多的信息。这意味着如果您在 Linux 机器上工作,例如克隆由 Mac 用户创建的 Git 存储库,您可以轻松地在 Linux 机器上获得 NFD 编码的文件名。所以 Linux 文件系统并不关心文件名的编码方式。它只是将其视为一个字节序列。因此,即使我的语言环境是
"en_US.UTF-8"
,我也可以轻松编写一个脚本来创建一个 ISO-Latin-1 编码的文件名。 .当前的语言环境设置只是应用程序的指导方针,但如果应用程序忽略了语言环境设置,则没有什么可以阻止它们这样做。
readdir
返回正在使用 NFC 或 NFD,您应该在解码后始终分解:
use Unicode::Normalize;
print "found\n" if NFD( $filename_read ) eq NFD( filename );
关于perl - readdir 以什么编码返回文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37027051/
我对自定义 CSS 或在将图像作为 Logo 上传到页面时使用编码 block 有疑问。我正在为我的网站使用 squarespace,我需要帮助编码我的 Logo 以使其适合每个页面。一个选项是使用自
如 encoding/json 包文档中所述, Marshal traverses the value v recursively. If an encountered value implement
我必须做一些相当于Java中的iconv -f utf8 -t sjisMS $INPUT_FILE的事情。该命令在 Unix 中 我在java中没有找到任何带有sjisMS的编码。 Java中有Sh
从 PHP 5.3 迁移到 PHP 5.6 后,我遇到了编码问题。我的 MySQL 数据库是 latin1,我的 PHP 文件是 windows-1251。现在一切都显示为“ñëåäíèòå àäðå
我有一个 RScript文件(我们称之为 main.r ),它引用了另一个文件,使用以下代码: source("functions.R") 但是,当我运行 RScript 文件时,它提示以下错误:
我无法设法从 WSDL 创建 RPC/编码风格的代码 - 有谁知道哪个框架可以做到这一点? 带有 adb 和 xmlbeans 映射的 Axis2 无法正常工作(无法处理响应中的肥皂编码)直接使用 X
安装了最新版本的Node.Js()和npm包**(1.2.10)**当我运行 Express 命令来生成项目时,它向我抛出以下错误 buffer.js:240 switch (encoding &
JavaScript中有JSON编码/解码base64编码/解码函数吗? 最佳答案 是的,btoa() 和 atob() 在某些浏览器中可以工作: var enc = btoa("this is so
>>> unicode('восстановление информации', 'utf-16') Traceback (most recent call last): File "", line
我当然熟悉 java.net.URLEncoder 和 java.net.URLDecoder 类。但是,我只需要 HTML 样式的编码。 (我不想将 ' ' 替换为 '+' 等)。我不知道任何只做
有一个非常简单的 SSIS 包: OLE DB Source 通过 View 获取数据(数据库表 nvarchar 或 nchar 中的所有字符串列)。 派生列,用于格式化现有日期并将其添加到数据集(
我正在使用一个在 Node 中进行base64编码的软件,如下所示: const enc = new Buffer('test', 'base64') console.log(enc) 显示: 我正
我试图将带有日语字符的数据插入到 oracle 数据库中。事情是保存在数据库中的是一堆倒置的问号。我该如何解决这个问题 最佳答案 见 http://www.errcode.net/blogs/?p=6
当我在 java 中解压 zip 文件时,我发现文件名中出现了带有重音字符的奇怪行为。 西索: Add File user : L'equipe Technique -- Folder : spec
在网上冲浪我找到了 ExtJS 的 Ext.Gantt 插件,该扩展有一个特殊的编码。任何人都知道如何编码那样或其他复杂的形式。 Encoded Gantt Chart 最佳答案 它似乎被 Dean
我正在用C语言做一个编码任务,我进展顺利,直到读取符号并根据表格分配相应的代码的部分。我必须连接几个代码,直到它们的长度达到 32 位,为此我必须将它们写入一个文件中。这种写入文件的方法给我带来了很多
我有一个外部链接的 javascript 文件。在那个 javascript 里面,我有这个功能: function getMonthNumber(monthName){ monthName = mo
使用mechanize,我检索到一个网页的源页面,其中包含一些非ASCII字符,比如汉字。 代码如下: #using python2.6 from mechanize import Browser b
我有一个包含字母 ø 的文件。当我用这段代码 File.ReadLines(filePath) 读取它时,我得到了一个问号而不是它。 当我像这样添加编码时 File.ReadLines(filePat
如何翻译下面的字符串 H.P. Dembinski, B. K\'{e}gl, I.C. Mari\c{s}, M. Roth, D. Veberi\v{c} 进入 H. P. Dembinski,
我是一名优秀的程序员,十分优秀!