这取决于语言。在许多语言中,不需要转义非 ASCII,但您可能必须告诉编译器源代码是什么编码。例如:
$ java -encoding UTF-8 SomeThing.java
或
$ perl -Mutf8 somescript
尽管使用 Perl、Python 和 Ruby 之类的东西,您可以将声明放在文件中,前提是它与 ASCII 向上兼容。例如:
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use autodie;
my $s = "Où se trouve mon élève?";
if ($s =~ /élève/) { ... }
# although of course this also works fine:
while ($s =~ /\b(\w+)\b/g) {
print "Found <$1>\n";
}
这是最简单的方法,我强烈推荐它:只需将真正的 UTF-8 字符放入源代码中即可。如果你必须想办法逃避事情,好吧,那就不方便了。
如果您打算使用转义符,那么您指定非 ASCII 符号的方式也会因语言而异。在 Java 中,您可以通过 \uXXXX 使用 asquerous Java 预处理器:
String s = "e\u0301le\u0300ve";
虽然我不推荐这种方式。如果要在模式中使用,可以延迟插值,这样既干净又杂乱:
String s = "e\\u0301le\\u0300ve";
第二种机制使您免于在 Java 预处理器使用它之后试图弄清楚它是什么(您不能使用\u0022,但可以使用\\0022),但是它会搞砸您的模式.CANON_EQ 标志。
大多数其他语言都有一种比 Java 更直接的方法——Java 也坚持使用丑陋的 UTF-16,除非您使用 java -encoding UTF-8 作为源代码。硬编码 UTF-16 代理绝对是愚蠢的。不要这样做!
在 Perl 中你可以使用:
my $s = "e\x{301}le\x{300}ve"; # NFD form
my $s = "\xE9l\xE8ve"; # NFC form
但你也可以象征性地命名它们
use charnames qw< :full >;
my $s_as_NFD = "e\N{COMBINING ACUTE ACCENT}le\N{COMBINING GRAVE ACCENT}e";
my $s_as_NFC = "\N{LATIN SMALL LETTER E WITH ACUTE}l\N{LATIN SMALL LETTER E WITH GRAVE}ve";
如果您愿意,可以缩短最后一个:
use charnames qw< :full latin >;
my $s_as_NFC = "\N{e WITH ACUTE}l\N{e WITH GRAVE}ve";
所有这些都比将幻数硬编码到您的代码中要好得多。
这一切都假设您的语言支持 Unicode,但很多不支持。