encoding - スクリプトを ascii 及び utf8 以外で記述できるようにする
encoding - allows you to write your script in non-ascii or non-utf8

目次 TABLE OF CONTENTS


名前 NAME

encoding - スクリプトを ascii 及び utf8 以外で記述できるようにする encoding - allows you to write your script in non-ascii or non-utf8


概要 SYNOPSIS

  use encoding "greek";  # Perl like Greek to you?
  use encoding "euc-jp"; # Jperl!

  # or you can even do this if your shell supports your native encoding

  perl -Mencoding=latin2 -e '...' # Feeling centrally European?
  perl -Mencoding=euc-kr -e '...' # Or Korean?

  # more control

  # A simple euc-cn => utf-8 converter
  use encoding "euc-cn", STDOUT => "utf8";  while(<>){print};

  # "no encoding;" supported (but not scoped!)
  no encoding;

  # an alternate way, Filter
  use encoding "euc-jp", Filter=>1;
  # now you can use kanji identifiers -- in euc-jp!

  # switch on locale -
  # note that this probably means that unless you have a complete control
  # over the environments the application is ever going to be run, you should
  # NOT use the feature of encoding pragma allowing you to write your script
  # in any recognized encoding because changing locale settings will wreck
  # the script; you can of course still use the other features of the pragma.
  # これはおそらく, アプリケーションが実行される環境に対する完全な
  # 制御を持っているのでなければ, 認識された何らかのエンコーディングで
  # スクリプトを記述できるようにするencodingプラグマのこの機能は
  # 使うべきではありません, なぜならロケール設定の変化でスクリプトが
  # 破損してしまうからです; もちろんこのプラグマのこれ以外の機能は
  # 使用できます.
  use encoding ':locale';

要約 ABSTRACT

これまでの歴史からはじめてみましょうか: Unicode のサポートは Perl 5.6.0 から始まりました. これによって substr() や正規表現を 複雑な CJK 文字に対してでも適用できるようになりました -- そのスクリプトが UTF-8 で書かれていさえすれば. しかしその頃に 戻ってみると, UTF-8 をサポートしているテキストエディタはまだ 稀であり多くのユーザは Perl 5.6 の全ての新しい機能をあきらめて レガシーエンコーディングで書くことを選んでいました. Let's start with a bit of history: Perl 5.6.0 introduced Unicode support. You could apply substr() and regexes even to complex CJK characters -- so long as the script was written in UTF-8. But back then, text editors that supported UTF-8 were still rare and many users instead chose to write scripts in legacy encodings, giving up a whole new feature of Perl 5.6.

未来に巻き戻ってみると: perl 5.8.0 から encoding プラグマ が提供されるようになり, スクリプトを自分の好きな任意の エンコーディング(Encodeモジュールがサポートしてさえいれば) で Unicode の恩恵を得ながらかけるようになりました. このプラグマは以下のことを行えるようにすることを目的としています: Rewind to the future: starting from perl 5.8.0 with the encoding pragma, you can write your script in any encoding you like (so long as the Encode module supports it) and still enjoy Unicode support. This pragma achieves that by doing the following:

リテラルの変換 Literal Conversions

次のように EUC-JP でコードを書くことができます: You can write code in EUC-JP as follows:

  my $Rakuda = "\xF1\xD1\xF1\xCC"; # Camel in Kanji
               #<-char-><-char->   # 4 octets
  s/\bCamel\b/$Rakuda/;

そして use encoding "euc-jp" の影響下では, 以下の UTF-8 で書かれたコードを同じです: And with use encoding "euc-jp" in effect, it is the same thing as the code in UTF-8:

  my $Rakuda = "\x{99F1}\x{99DD}"; # two Unicode Characters
  s/\bCamel\b/$Rakuda/;

STD(IN|OUT) の PerlIO レイヤ PerlIO layers for STD(IN|OUT)

encoding プラグマは STDIN 及び STDOUT の ファイルハンドルレイヤも指定したエンコーディングへと 変更します. それによって, The encoding pragma also modifies the filehandle layers of STDIN and STDOUT to the specified encoding. Therefore,

  use encoding "euc-jp";
  my $message = "Camel is the symbol of perl.\n";
  my $Rakuda = "\xF1\xD1\xF1\xCC"; # Camel in Kanji
  $message =~ s/\bCamel\b/$Rakuda/;
  print $message;

は "\x{99F1}\x{99DD} is the symbol of perl.\n" ではなく "\xF1\xD1\xF1\xCC is the symbol of perl.\n" と出力します. Will print "\xF1\xD1\xF1\xCC is the symbol of perl.\n", not "\x{99F1}\x{99DD} is the symbol of perl.\n".

引数に追加することでこの振る舞いを上書きすることもできます; 詳細は後述します. You can override this by giving extra arguments; see below.

バイト文字列の暗黙のアップグレード Implicit upgrading for byte strings

デフォルトでは, byte セマンティクスにある文字列操作と Unicode 文字の文字列データが連結されるときには, byte 文字列を ISO 8859-1 (Latin-1) でデコードした 新しい文字列が生成されます. By default, if strings operating under byte semantics and strings with Unicode character data are concatenated, the new string will be created by decoding the byte strings as ISO 8859-1 (Latin-1).

encoding プラグマはこのときにかわりに指定したエンコーディングを 使うように変更します. 例えば: The encoding pragma changes this to use the specified encoding instead. For example:

    use encoding 'utf8';
    my $string = chr(20000); # a Unicode string
    utf8::encode($string);   # now it's a UTF-8 encoded byte string
    # concatenate with another Unicode string
    print length($string . chr(20000));

2 を出力します, これは $string は UTF-8 として アップグレードされるためです. use encoding 'utf8'; が なければ, $string は Latin-1 として処理され3オクテット となるため 4 が出力されます. Will print 2, because $string is upgraded as UTF-8. Without use encoding 'utf8';, it will print 4 instead, since $string is three octets when interpreted as Latin-1.

副作用 Side effects

encoding プラグマがスコープ内にあるときは 返される長さは $/ の Unicode 文字での長さから計算して 返されます, これはネイティブエンコーディングでの $/ の 長さと常に同じというわけではありません. If the encoding pragma is in scope then the lengths returned are calculated from the length of $/ in Unicode characters, which is not always the same as the length of $/ in the native encoding.

このプラグマは utf8::upgrade に影響しますが, utf8::downgrade には影響しません. This pragma affects utf8::upgrade, but not utf8::downgrade.

Side effects

If the encoding pragma is in scope then the lengths returned are calculated from the length of $/ in Unicode characters, which is not always the same as the length of $/ in the native encoding.

This pragma affects utf8::upgrade, but not utf8::downgrade.


5.8.1 を要求する機能 FEATURES THAT REQUIRE 5.8.1

このプラグマから提供している幾つかの機能は perl 5.8.1 を 必要とします. これらの多くは Inaba Hiroto によって行われ ました. それ以外の機能及び変更であれば 5.8.0 で大丈夫です. Some of the features offered by this pragma requires perl 5.8.1. Most of these are done by Inaba Hiroto. Any other features and changes are good for 5.8.0.

"EUC以外の" ダブルバイトエンコーディング "NON-EUC" doublebyte encodings

perl はこのプラグマを適用する前にスクリプトをパースする 必要ガルので, Shift_JIS や Big-5 といった '\' (バックスラッシュ; \x5c) を2バイト目に含んでいるエンコーディングはそのバイトが それに続く文字をうっかりエスケープしてしまうことで正常に 動作しないことがあります. Perl 5.8.1 以降ではこの問題は 修正されています. Because perl needs to parse script before applying this pragma, such encodings as Shift_JIS and Big-5 that may contain '\' (BACKSLASH; \x5c) in the second byte fails because the second byte may accidentally escape the quoting character that follows. Perl 5.8.1 or later fixes this problem.

tr//

perl 5.8.0 がリリースされたとき, tr/// は Perl 5 porter 達に 見落とされていました. 詳細は後述のセクションを参照してください. tr// was overlooked by Perl 5 porters when they released perl 5.8.0 See the section below for details.

DATA 仮想ファイルハンドル DATA pseudo-filehandle

それ以外にもう一つ見落とされていた機能として DATA がありました. Another feature that was overlooked was DATA.


使用方法 USAGE

use encoding [ENCNAME] ;

スクリプトのエンコーディングを ENCNAME に設定します. そして ${^UNICODE} が存在して0以外を共に満たす時以外は STDIN 及び STDOUT の PerlIO レイヤは ":encoding(ENCNAME)" へと設定されます. Sets the script encoding to ENCNAME. And unless ${^UNICODE} exists and non-zero, PerlIO layers of STDIN and STDOUT are set to ":encoding(ENCNAME)".

STDERR は変更されない点に注意してください. Note that STDERR WILL NOT be changed.

また STD 以外のファイルハンドルもまた影響を受けません. それらのレイヤを変更するには use open 若しくは binmode を使うようにしてください. Also note that non-STD file handles remain unaffected. Use use open or binmode to change layers of those.

エンコーディングが指定されなかったときには, 環境変数 PERL_ENCODING が参照されます. もし指定のエンコーディングが 見つからなかったときには Unknown encoding 'ENCNAME' エラーが投げられます. If no encoding is specified, the environment variable PERL_ENCODING is consulted. If no encoding can be found, the error Unknown encoding 'ENCNAME' will be thrown.

use encoding ENCNAME [ STDIN => ENCNAME_IN ...] ;

STDIN と STDOUT のエンコーディング設定を STDIN => ENCNAME 形式で個別に設定することも出来ます. この時, はじめの ENCNAME は省略できません. STDIN => undef で IO コード変換を完全に解除できます. You can also individually set encodings of STDIN and STDOUT via the STDIN => ENCNAME form. In this case, you cannot omit the first ENCNAME. STDIN => undef turns the IO transcoding completely off.

${^UNICODE} が存在して 0 でないときには, このオプションは 完全に無視されます. ${^UNICODE> は perl 5.8.1 で導入された 変数です. perlvar 内 "${^UNICODE}" 及び perlrun 内 "-C" を参照してください(perl 5.8.1 以降). When ${^UNICODE} exists and non-zero, these options will completely ignored. ${^UNICODE} is a variable introduced in perl 5.8.1. See "${^UNICODE}" in perlvar and "-C" in perlrun for details (perl 5.8.1 and later).

use encoding ENCNAME Filter=>1;

encoding プラグマをソースフィルタとします. デフォルトの アプローチでは埋め込みのされているリテラル(qq()及びqr()内)にのみ 作用するので, これは完全なソースコードに対するソースフィルタの 適用になります. 詳細は "The Filter Option" を参照してください. This turns the encoding pragma into a source filter. While the default approach just decodes interpolated literals (in qq() and qr()), this will apply a source filter to the entire source code. See "The Filter Option" below for details.

no encoding;

スクリプトのエンコーディングを解除します. STDIN, STDOUT の レイヤは ":raw" (デフォルトの処理されない生のバイトストリーム) へとリセットされます. Unsets the script encoding. The layers of STDIN, STDOUT are reset to ":raw" (the default unprocessed raw stream of bytes).


フィルタオプション The Filter Option

use encoding の魔法は識別子の名前には適用されません. ${"\x{4eba}"}++ ($human++, human は漢字一文字) が動作するように するには, いまでもスクリプトを UTF-8 で書く必要があります -- もしくはソースフィルタを使います. 'Filter=>1' はそれを行います. The magic of use encoding is not applied to the names of identifiers. In order to make ${"\x{4eba}"}++ ($human++, where human is a single Han ideograph) work, you still need to write your script in UTF-8 -- or use a source filter. That's what 'Filter=>1' does.

これが意味するところは何でしょうか. それはソースコードが あたかも UTF-8 で記述され, 'use utf8' の影響下にあるかのように 振る舞うということです. つまりあなたの使っているエディタが 例えば Shift_JIS のみしかサポートしていなかったとしても, Programming Perl, 3rd Ed. の15章にある例を試すことが できます. そう, 例えば UTF-8 を使うことができるのです. What does this mean? Your source code behaves as if it is written in UTF-8 with 'use utf8' in effect. So even if your editor only supports Shift_JIS, for example, you can still try examples in Chapter 15 of Programming Perl, 3rd Ed.. For instance, you can use UTF-8 identifiers.

このオプションは大きな速度低下を伴い, そして(これを書いている 時点ではこのオプションを使わずに UTF-8 で書かれているソースコード での非ASCIIの識別子は十分安定しているというわけではありません. This option is significantly slower and (as of this writing) non-ASCII identifiers are not very stable WITHOUT this option and with the source code written in UTF-8.

Encode version 1.87 での Filter に関する変更点 Filter-related changes at Encode version 1.87


警告 CAVEATS

スコープを持たない NOT SCOPED

このプラグマはブロックレキシカル単位ではなくスクリプト単位です. 最後の use encoding 若しくは no encoding のみが スクリプト全体 に影響を持ちます. しかし, no encoding プラグマ がサポートされており, use encoding はスクリプトの中で 必要な回数だけ置くことができます. このプラグマの複数回の使用は 非推奨です. The pragma is a per script, not a per block lexical. Only the last use encoding or no encoding matters, and it affects the whole script. However, the <no encoding> pragma is supported and use encoding can appear as many times as you want in a given script. The multiple use of this pragma is discouraged.

同じ理由から, このプラグマのモジュール内での利用は推奨されません (とはいえ上のケースと同様に強く推奨されません. 後述.). By the same reason, the use this pragma inside modules is also discouraged (though not as strongly discouraged as the case above. See below).

もしこのプラグマを使ってモジュールを書く必要があるのなら, ロード順序にとても気をつけてください. 以下のコードを見てください; If you still have to write a module with this pragma, be very careful of the load order. See the codes below;

  # called module
  package Module_IN_BAR;
  use encoding "bar";
  # stuff in "bar" encoding here
  1;

  # caller script
  use encoding "foo"
  use Module_IN_BAR;
  # surprise! use encoding "bar" is in effect.

この奇妙な動作を回避する最善の方法は他のモジュールをロードした 直後にこのプラグマを use することです. The best way to avoid this oddity is to use this pragma RIGHT AFTER other modules are loaded. i.e.

  use Module_IN_BAR;
  use encoding "foo";

複数のエンコーディングをまぜない DO NOT MIX MULTIPLE ENCODINGS

レガシーコードポイントを持っているリテラル(文字列及び 正規表現)のみが影響します; もし次のようにデータを混ぜると Notice that only literals (string or regular expression) having only legacy code points are affected: if you mix data like this

    \xDF\x{100}

データは指定したネイティブエンコーディングではなく(Latin 1 及び) ユニコードであると仮定されます. 言い換えるとこれは "ギリシャ文字"にマッチします. the data is assumed to be in (Latin 1 and) Unicode, not in your native encoding. In other words, this will match in "greek":

    "\xDF" =~ /\x{3af}/

しかしつぎのものはマッチしません but this will not

    "\xDF\x{100}" =~ /\x{3af}\x{100}/

これは左辺にある \xDF (ISO 8859-7 GREEK SMALL LETTER IOTA WITH TONOS) は \x{100} が左辺にあるために \x{3af} (Unicode GREEK SMALL LETTER IOTA WITH TONOS) にアップグレード されないためです. 同じ文字列の中にレガシーデータとユニコード を混ぜないようにしてください. since the \xDF (ISO 8859-7 GREEK SMALL LETTER IOTA WITH TONOS) on the left will not be upgraded to \x{3af} (Unicode GREEK SMALL LETTER IOTA WITH TONOS) because of the \x{100} on the left. You should not be mixing your legacy data and Unicode in the same string.

このプラグマは 0x80..0xFF コードポイント範囲のエンコーディングにも 影響します: 通常この範囲にある文字は8ビットバイトとして 残りますが(0x100以降のコードポイントの文字と結合しているので なければ), encoding プラグマが有効であれば 0x80..0FF の範囲も 常に UTF-8 エンコードされます. This pragma also affects encoding of the 0x80..0xFF code point range: normally characters in that range are left as eight-bit bytes (unless they are combined with characters with code points 0x100 or larger, in which case all characters need to become UTF-8 encoded), but if the encoding pragma is present, even the 0x80..0xFF range always gets UTF-8 encoded.

最後に, このプラグマに関する最高のことはあなたの名前をネイティブ エンコードで綴るそのために \x{....} を使う必要がない ということです. つまりあなたの文字列をあなたのエンコーディングで 文字列中や正規表現に自由におくことができます. After all, the best thing about this pragma is that you don't have to resort to \x{....} just to spell your name in a native encoding. So feel free to put your strings in your encoding in quotes and regexes.

範囲を使っている tr/// tr/// with ranges

encoding プラグマは q//,qq//,qr//,qw///, qx// 等にある 文字列リテラルを強制的にデコードすることで動作しています. perl 5.8.0 ではこれは tr/// には適用されません. つまり, The encoding pragma works by decoding string literals in q//,qq//,qr//,qw///, qx// and so forth. In perl 5.8.0, this does not apply to tr///. Therefore,

  use encoding 'euc-jp';
  #....
  $kana =~ tr/\xA4\xA1-\xA4\xF3/\xA5\xA1-\xA5\xF3/;
  #           -------- -------- -------- --------

これが以下のようには動作しません. Does not work as

  $kana =~ tr/\x{3041}-\x{3093}/\x{30a1}-\x{30f3}/;
上の例で使われてい文字の凡例 Legend of characters above
  utf8     euc-jp   charnames::viacode()
  -----------------------------------------
  \x{3041} \xA4\xA1 HIRAGANA LETTER SMALL A
  \x{3093} \xA4\xF3 HIRAGANA LETTER N
  \x{30a1} \xA5\xA1 KATAKANA LETTER SMALL A
  \x{30f3} \xA5\xF3 KATAKANA LETTER N

この直感的でない振る舞いは perl 5.8.1 で修正されています. This counterintuitive behavior has been fixed in perl 5.8.1.

tr/// の回避方法 workaround to tr///;

perl 5.8.0 では次のように対処することが出来ます; In perl 5.8.0, you can work around as follows;

  use encoding 'euc-jp';
  #  ....
  eval qq{ \$kana =~ tr/\xA4\xA1-\xA4\xF3/\xA5\xA1-\xA5\xF3/ };

tr/// 式が qq{} で囲まれていることに注意してください. この背景にあるアイデアは tr/// に'埋め込む'古典的なイディオムと 同じです. Note the tr/// expression is surrounded by qq{}. The idea behind is the same as classic idiom that makes tr/// 'interpolate'.

   tr/$from/$to/;            # wrong!
   eval qq{ tr/$from/$to/ }; # workaround.

いずれにせよ, encoding プラグマにおいては q// も 影響を受けるので, tr/// がデコードされないのは明らかに Perl5 Porters に対する願望であり, これは Perl 5.8.1 以降で 修正されました. Nevertheless, in case of encoding pragma even q// is affected so tr/// not being decoded was obviously against the will of Perl5 Porters so it has been fixed in Perl 5.8.1 or later.


EXAMPLE - Greekperl

    use encoding "iso 8859-7";

    # \xDF in ISO 8859-7 (Greek) is \x{3af} in Unicode.

    $a = "\xDF";
    $b = "\x{100}";

    printf "%#x\n", ord($a); # will print 0x3af, not 0xdf

    $c = $a . $b;

    # $c will be "\x{3af}\x{100}", not "\x{df}\x{100}".

    # chr() is affected, and ...

    print "mega\n"  if ord(chr(0xdf)) == 0x3af;

    # ... ord() is affected by the encoding pragma ...

    print "tera\n" if ord(pack("C", 0xdf)) == 0x3af;

    # ... as are eq and cmp ...

    print "peta\n" if "\x{3af}" eq  pack("C", 0xdf);
    print "exa\n"  if "\x{3af}" cmp pack("C", 0xdf) == 0;

    # ... but pack/unpack C are not affected, in case you still
    # want to go back to your native encoding

    print "zetta\n" if unpack("C", (pack("C", 0xdf))) == 0xdf;

既知の問題 KNOWN PROBLEMS

127 バイトを超える正規表現中のリテラル literals in regex that are longer than 127 bytes

ネイティブマルチバイトエンコーディング(固定長でも可変長でも) において, 現在の正規表現の実装は127バイトを超える正規表現リテラルの ためにエラーの記録を導入するでしょう. For native multibyte encodings (either fixed or variable length), the current implementation of the regular expressions may introduce recoding errors for regular expression literals longer than 127 bytes.

EBCDIC

encoding プラグマは EBCDIC プラットフォームではサポート されていません(参加したくてこの制限を削除できるPorterを 歓迎します). The encoding pragma is not supported on EBCDIC platforms. (Porters who are willing and able to remove this limitation are welcome.)

format

このプラグマではフォーマットはうまく動作しません, なぜなら PerlIO はこれとはあまりあわないためです. フォーマットが非ascii文字を含んでいるときにはそれは 変なものが表示されるか "wide character warnings" を 得るでしょう. 把握するには次のコードを試してみるとよいでしょう. This pragma doesn't work well with format because PerlIO does not get along very well with it. When format contains non-ascii characters it prints funny or gets "wide character warnings". To understand it, try the code below.

  # Save this one in utf8
  # replace *non-ascii* with a non-ascii string
  my $camel;
  format STDOUT =
  *non-ascii*@>>>>>>>
  $camel
  .
  $camel = "*non-ascii*";
  binmode(STDOUT=>':encoding(utf8)'); # bang!
  write;              # funny 
  print $camel, "\n"; # fine

binmode がなければこれは動作しますが, その時は write() のかわりに print() が失敗するようになります. Without binmode this happens to work but without binmode, print() fails instead of write().

いずれにしても, フォーマットのユニコード文字を伴った利用は, 文字の幅(つまり全角の文字)や方向(つまりアラビアやヘブライのBIDI) といったことを考える必要があるため不確かな事象です. At any rate, the very use of format is questionable when it comes to unicode characters since you have to consider such things as character width (i.e. double-width for ideographs) and directions (i.e. BIDI for Arabic and Hebrew).

:locale のロジック The Logic of :locale

:locale のロジックは次のようになっています: The logic of :locale is as follows:

1.

プラットフォームが langinfo(CODESET) インターフェースを サポートしていれば, 返されるコードセットが open プラグマの デフォルトエンコーディングとして使われます. If the platform supports the langinfo(CODESET) interface, the codeset returned is used as the default encoding for the open pragma.

2.

1. が動作しなくて locale プラグマの影響下にあり, 環境変数 LC_ALL 及び LANG が(この順番で使われます) エンコーディングにマッチし(もしあれば . 以降の部分), そしてそれが見つかれば, それが open プラグマの デフォルトエンコーディングとして使われます. If 1. didn't work but we are under the locale pragma, the environment variables LC_ALL and LANG (in that order) are matched for encodings (the part after ., if any), and if any found, that is used as the default encoding for the open pragma.

3.

1. も 2. も動作しなくて, 環境変数 LC_ALL 及び LANG が(この順番で使われます) UTF-8 っぽい何かにマッチして, そしてそれが見つかれば, それが open プラグマの デフォルトエンコーディングとして使われます. If 1. and 2. didn't work, the environment variables LC_ALL and LANG (in that order) are matched for anything looking like UTF-8, and if any found, :utf8 is used as the default encoding for the open pragma.

もしロケール環境変数 (LC_ALL, LC_CTYPE, LANG) が 'UTF-8' 若しくは 'UTF8' を含んでいれば(大文字小文字は区別しない), STDIN, STDOUT, STDERR, そしてその後のファイルオープンの デフォルトエンコーディングは UTF-8 になります. If your locale environment variables (LC_ALL, LC_CTYPE, LANG) contain the strings 'UTF-8' or 'UTF8' (case-insensitive matching), the default encoding of your STDIN, STDOUT, and STDERR, and of any subsequent file open, is UTF-8.


履歴 HISTORY

このプラグマは Perl 5.8.0 から提供されています. 動作には 5.8.1 以降が望ましいです, 前述を参照. This pragma first appeared in Perl 5.8.0. For features that require 5.8.1 and better, see above.

:locale サブプラグマは 2.01 若しくは Perl 5.8.6 で実装されました. The :locale subpragma was implemented in 2.01, or Perl 5.8.6.


関連項目 SEE ALSO

perlunicode, Encode, open, Filter::Util::Call,

Ch. 15 of Programming Perl (3rd Edition) by Larry Wall, Tom Christiansen, Jon Orwant; O'Reilly & Associates; ISBN 0-596-00027-8


和訳 TRANSALTE TO JAPANESE

 山科 氷魚 (YAMASHINA Hio) <hio@hio.jp>

原典: Encode VERSION 2.23. 翻訳日: 2007-06-23. Original distribution is Encode VERSION 2.23. Translated at 2007-06-23.

encoding - スクリプトを ascii 及び utf8 以外で記述できるようにする
encoding - allows you to write your script in non-ascii or non-utf8

索引 INDEX

encoding - スクリプトを ascii 及び utf8 以外で記述できるようにする
encoding - allows you to write your script in non-ascii or non-utf8