http://blog.dksg.jp/2008/05/phpshift-jis.html
Shift_JISで表現できない文字が含まれているかを判定する方法
unicodeの文字列を一度Shift_JISに変換して文字が化けたら、Shift_JISで表現できない文字が含まれると判定できる。
判定の疑似コードとしては以下のような感じ。
function ishiftJisOnly(unicodeString) { shiftJisString = unicodeからshiftjisに変換(unicodeString); convertedUnicodeString = shiftjisからunicodeに変換(shiftJisString); if (unicodeString != convertedUnicodeString) { return "Shift_JISで表現できない文字が含まれている"; } else { return "含まれていない"; } }
SQL Server での判定方法
unicodeが格納できない型(varchar)の列を用意してやり、そこにunicode入りの文字(nvarcharの列に格納されているハズ)を無理矢理そこに格納するupdateを走らせると、Shift_JISで表現できない文字が化ける。
あとは「unicode入りの列」と「文字化けた可能性がある列」を比較して異なっていれば、Shift_JISで表現できない文字が含まれていると判定できる。
サンプルコード
-- テスト用テーブル create table #TEST_CHAR ( c_unicode nvarchar(99) -- unicodeが格納できる型 , c_sjis varchar(99) -- unicodeが格納できない型 ) insert into #TEST_CHAR values (N'あいう[unicodeの文字]', N'') -- sjisで表現できないデータ insert into #TEST_CHAR values (N'あいう' , N'') -- sjisで表現できるデータ -- unicodeの値を、unicodeが保存できないvarcharに格納することで化けさせる update #TEST_CHAR set c_sjis = c_unicode; -- 文字が化けて元の値と異なるようになったレコードを抽出すると、 -- sjisで表現できないデータを含んだレコードが抽出できる select * from #TEST_CHAR where c_sjis <> c_unicode;