言語によって異なります。多くの言語であり、非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";
私はそのようにお勧めしませんが。第二のメカニズムは、それがJavaプリプロセッサの後にあるかを把握しようとするからあなたを惜しみ
String s = "e\\u0301le\\u0300ve";
こと:それはパターンで使用するために起こっている場合は、同時に補間、きれいで、メシエを遅らせることができます(\u0022
は使用できませんが、\\0022
を使用することはできません)、Pattern.CANON_EQフラグを無効にします。
他のほとんどの言語では、そのJavaをより簡単に行うことができます。あなたのソースにjava -encoding UTF-8
を使用しない限り、醜いUTF-16を主張します。 UTF-16代理人をハードコーディングすることは絶対にばかげています。それをしません!!
Perlでは、あなたは使用することができます
my $s = "e\x{301}le\x{300}ve"; # NFD form
my $s = "\xE9l\xE8ve"; # NFC form
いますが、象徴的にそれらに名前を付けることができ
あなたが好む場合は、最後の1ははるかに短くすることができる
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をサポートしていることを前提としていますが、多くはそうしていないことを前提としています。
C++を使用している場合は、[ICU regex library](http://userguide.icu-project.org/strings/regexp)を強くお勧めします。あなたは私の答えで説明したように、記号的な名前を使うことができます。あなたはおそらくPCREも使うことができますが、私はCからではなくCからのPCREしか使用していません。 – tchrist
@tchrist:もう一度、あなたは信じられないほど役に立つヒントを提供します。ありがとうございました!私は間違いなく長期的にこのアドバイスに従いますが、今は組み込みのwxRegExライブラリを使用して取得する必要があります。 –