Skip to content

Instantly share code, notes, and snippets.

@ttdoda
Last active March 31, 2017 02:45
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ttdoda/465e7abd8e256bddc8099e69abbc548a to your computer and use it in GitHub Desktop.
Save ttdoda/465e7abd8e256bddc8099e69abbc548a to your computer and use it in GitHub Desktop.
端末の漢字コード設定の判別
#!/usr/bin/env ruby
# encoding: ascii-8bit
#
# 端末の漢字コード設定判別のサンプルスクリプト
#
# コンセプトとしてはUTF-8, EUC-JP, Shift_JISのどれと解釈しても正しい、
# しかしどのエンコーディングとして解釈したかで端末での表示幅が変わる
# バイト列を送信し、その時のカーソル位置で端末がどのエンコーディング
# として解釈したかを判別する。
#
# チェック用バイト列: "\xe6\xa4\xa3\xe6\x8e\xa7"
#
# このバイト列は各エンコーディングで以下のように解釈される。
#
# UTF-8 => "椣控" (4桁)
# EUC-JP => "罎fァ" (5桁)
# Shift_JIS => "讀」謗ァ" (6桁)
#
# License: CC0
#
require 'io/console'
cols = 0
STDIN.raw do |stdin|
print "\r" # カーソルを行頭に移動
print "\xe6\xa4\xa3\xe6\x8e\xa7" # チェック用バイト列
print "\e[6n" # カーソル位置問い合わせ
print "\e[1K" # カーソル位置から行頭までを消去
print "\r" # カーソル位置を行頭に移動
buff = ""
while c = stdin.getc
buff << c.chr
break if /(\x9c|\x1b\[)(\d+);(\d+)R/ =~ buff # カーソル位置の応答(CPR)が含まれているか確認
end
cols = $3.to_i
end
case cols
when 5
puts "UTF-8"
when 6
puts "EUC-JP"
when 7
puts "Shift JIS"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment