質問: Shift_JISには(いわゆる半角の)バックスラッシュ記号は存在せず、 ASCIIにおいてバックスラッシュの割り当てられたコード位置に円記号が存在します。 Shift_JISでエンコードされたソースコードに対応したC/C++コンパイラは、 私の知る限りいずれもこの円記号をバックスラッシュと同一視して解釈しますが、 これは規格に適合した動作でしょうか。 例えば `"¥n"` とあった場合、これは「円記号とn」として解釈されるべきであって、 ラインフィードとして解釈するのは規格上正しくないのではないかと疑問に思いました。 規格に合致させるのであれば、バックスラッシュが存在しないShift_JISにおいては、 代替としてトライグラフ `??/` のシーケンスのみがバックスラッシュとして解釈されるのが 正しいのではないのでしょうか。 それともISOやJISなどの規格で、ASCIIのバックスラッシュと同一のコード位置にある記号は バックスラッシュとして解釈する、というような規定でも存在するのでしょうか。 コンパイラの実装や慣例ではなく、規格を厳密に解釈した場合の回答を頂きたいです。
回答: 厳密なShift_JIS (JISX0208 Appendix 1) では符号位置0x20-0x7fの範囲はJISX0201と同一であるはずで、その符号位置0x5cの文字はU+00a5ですから、U+005cと解釈してはいけないはずです。 トリックは「コンパイラの実装や慣例」の方ではなく「Shift_JISでエンコードされたソース」という呼び方の方にあります。通称「Shift_JISでエンコードされたソース」は、JISX0208 Appendix 1ではなくIANA Windows-31J (Microsoft CP932) を意味することがほとんどです。Windows-31Jでは7ビット符号範囲はASCIIと一致することになっており、符号位置0x5cはU+005cと解釈されます。(歴史的経緯から、フォントだけ円記号になってるんですが)