Linuxロケール-スマートクォートを無効にする方法


1

私のGentooシステムでは、find . -regextype help出力

find: Unknown regular expression type ‘help’; valid types are ‘findutils-default’, ‘awk’, ‘egrep’, ‘ed’, ‘emacs’, ‘gnu-awk’, ‘grep’, ‘posix-awk’, ‘posix-basic’, ‘posix-egrep’, ‘posix-extended’, ‘posix-minimal-basic’, ‘sed’.

私はいつもスマート引用符(またはそれらが呼ばれているもの)はMicrosoftソフトウェアの惨劇だと思っていました。私の他のシステム(Cygwin)では、LANGに設定されen_US.UTF-8スマートクォートも表示されます。設定を解除するLANGか、に設定するとen.UTF-8、出力は通常の単一引用符に変わります。

# unset LANG
# find -regextype help
find: Unknown regular expression type 'help'; valid types are 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-eg
rep', 'posix-extended', 'posix-minimal-basic', 'sed'.

しかし、前述のGentooシステムでは、LANGは設定されていません。(および他のロケールenv変数)をどのように設定しようとしても、間違ったロケールに関するスマートな引用符やエラーメッセージが表示されます。

単一引用符を取得する方法は?


このような引用は、「Microsoftソフトウェア」よりも何世紀も前からタイポグラフィに存在し、メカニカルタイプライターがそれらを単一の目盛りにマージしてキーを保存するずっと前から存在していました。彼らは、Windows-1252(それがあった)とISO-8859-1(そうではなかった)の間の非互換性のためにその名前を得ました。それで、もしあなたがあなた自身の宗教を守っていただければ…
悲しみ

1
おかげで、私はそれを知っています。プログラマーとして、私は彼らがソフトウェアで時々使われる方法を本当に嫌います。それらをタイポグラフィに置きますが、コードをコピーして貼り付け、ソフトウェアが引用を自動変換し、別の人がコードをコピーして貼り付けると、引用が間違っているため機能しません-それは間違っています。ワープロで本を書くときにそれは理にかなっていると理解していますが、この動作を有効/無効にするのはユーザーの選択であると思います(そして、ワープロには自動修正をオフにするオプションがあります)。私は人々に私の宗教への参加を求めているのではなく、ここでそれらを無効にする方法だけを教えています。
ジーンパブロフスキー

回答:


0

これは、スマートクォートシステムによって自動変換されません。そのテキストはGNUの直接出力ですfind。いくつかのシステム全体のスマート引用符インタプリタは、キーボードのみからの入力に影響を与えるだろう...と私はGNU / Linuxの/ BSDのための1つのことを聞いたことがない(私はどのように探していたので、私はこの記事を見つけたエンことができ、それ!)

コマンド出力の16進ダンプは次のとおりです。

$ find . -regextype help 2>&1 |head -c99
find: Unknown regular expression type help’; valid types are 
findutils-default’, ed
$ find . -regextype help 2>&1 |head -c99 |hd
00000000  66 69 6e 64 3a 20 55 6e  6b 6e 6f 77 6e 20 72 65  |find: Unknown re|
00000010  67 75 6c 61 72 20 65 78  70 72 65 73 73 69 6f 6e  |gular expression|
00000020  20 74 79 70 65 20 e2 80  98 68 65 6c 70 e2 80 99  | type ...help...|
00000030  3b 20 76 61 6c 69 64 20  74 79 70 65 73 20 61 72  |; valid types ar|
00000040  65 20 e2 80 98 66 69 6e  64 75 74 69 6c 73 2d 64  |e ...findutils-d|
00000050  65 66 61 75 6c 74 e2 80  99 2c 20 e2 80 98 65 64  |efault..., ...ed|
00000060  e2 80 99                                          |...|

これにより、出力が明示的な左および右の単一引用符マーチ文字を使用していることがわかりやすくなります(それぞれU + 2018およびU + 2019、このUnicodeコードポイントテーブルを参照)。UTF-8では、これらはe2 80 98and として表されe2 80 99ます。そのため、help(それ自体68 56 5c 70)の両側に3つのドット(非ASCII文字を示す)と引用符で囲まれた単語が表示されます。

したがって、次のように変換できますsed

$ find . -regextype help 2>&1 |head -c99 \
  |sed "s/\xe2\x80\x98/'/g; s/\xe2\x80\x99/'/g"
find: Unknown regular expression type 'help'; valid types are 
'findutils-default', 'ed'
$ find . -regextype help 2>&1 |head -c99 \
  |sed "s/\xe2\x80\x98/'/g; s/\xe2\x80\x99/'/g" |hd
00000000  66 69 6e 64 3a 20 55 6e  6b 6e 6f 77 6e 20 72 65  |find: Unknown re|
00000010  67 75 6c 61 72 20 65 78  70 72 65 73 73 69 6f 6e  |gular expression|
00000020  20 74 79 70 65 20 27 68  65 6c 70 27 3b 20 76 61  | type 'help'; va|
00000030  6c 69 64 20 74 79 70 65  73 20 61 72 65 20 27 66  |lid types are 'f|
00000040  69 6e 64 75 74 69 6c 73  2d 64 65 66 61 75 6c 74  |indutils-default|
00000050  27 2c 20 27 65 64 27                              |', 'ed'|

ねえ、答えてくれてありがとう。他の多くのプログラムと同様に、GNU findはl18nにGNU gettextを使用します。findが印刷したいものを印刷した後、スマートクォートシステムが稼働していることを意味しませんでした、findによって直接印刷されると確信していますが、印刷されるものはロケールによって異なります。前述のように、私のシステムの1つでLANGを設定解除するかen.UTF-8に設定すると、スマートクオートが消えますが、他のシステムでは消えません(正しく思い出せば、同じバージョンのfind-システム問題になっているため、確認できません)。
ジーンパブロフスキー

私は、sedまたは他のポストプロセッサを使用してそれらの引用符を取り除くことができることを理解していますが、私は欲しいのはソースで問題を修正し、find私が望むものを印刷することです。正しいロケールを設定するだけの質問であるべきです...
ジーンパブロフスキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.