[Python の人々: 私の質問は最後にあります :-)]
読みやすさとメンテナンスを容易にするために、C 文字列リテラル内で UTF-8 を使用したいと考えています。ただし、これは普遍的に移植可能ではありません。私の解決策は、0x80 以上のバイトの代わりにエスケープ シーケンスが含まれるようにfoo.c.in
、小さな perl スクリプトによってファイルに変換されるファイルを作成することです。foo.c
\xXX
簡単にするために、C 文字列は同じ行で開始および終了すると仮定します。
これは私が作成した Perl コードです。バイト >= 0x80 が見つかった場合、元の文字列もコメントとして出力されます。
use strict;
use warnings;
binmode STDIN, ':raw';
binmode STDOUT, ':raw';
sub utf8_to_esc
{
my $string = shift;
my $oldstring = $string;
my $count = 0;
$string =~ s/([\x80-\xFF])/$count++; sprintf("\\x%02X", ord($1))/eg;
$string = '"' . $string . '"';
$string .= " /* " . $oldstring . " */" if $count;
return $string;
}
while (<>)
{
s/"((?:[^"\\]++|\\.)*+)"/utf8_to_esc($1)/eg;
print;
}
たとえば、入力
"fööbär"
に変換されます
"f\xC3\xB6\xC3\xB6b\xC3\xA4r" /* fööbär */
最後に、私の質問: 私は Perl があまり得意ではありません。コードをよりエレガントな (またはより「Perlish」な) 方法で書き直すことができるかどうか疑問に思っています。また、誰かが Python で書かれた同様のコードを指摘してくれれば幸いです。