「~」
日本語 | から、にょろ、波ダッシュ |
英語 | WAVE DASH、FULLWIDTH TILDE |
ふりがな | から、にょろ、なみだっしゅ |
フリガナ | カラ、ニョロ、ナミダッシュ |
「○○から△△」という意味の全角文字。
「1~10」といった使用方法をする。
シフトJISとCP932の違いにより、文字化けの原因となる場合がある。
「~」の全角文字が「~」なのか、ということが根本にあり、シフトJISからUnicodeに変換した場合の0x301Cは「WAVE DASH」、CP932からUnicodeに変換した場合の0xFF5Eは「FULLWIDTH TILDE」という名称が付けられている。
このふたつは別の文字であり、後者の方が「~」に近く、前者は「~」を上下逆にしたものである。この変換の解釈の違いがこの問題の元である。「似たような文字だからどっちでもいいじゃん」という気もするが、文字化けやバグの原因となる非常に大きな問題である。
詳しくは「CP932」の項目を参考のこと。
上記の英語名称から、この問題を「WAVE DASH - FULLWIDTH TILDE問題」、「WAVE DASH問題」、「FULLWIDTH TILDE問題」と言うこともある。
対策のひとつとして、「~」に置き換えてしまうという方法もある。
YahooやAmazonはそうしている。
「-」に置き換えると意味がないので注意。
「1~10」といった使用方法をする。
シフトJISとCP932の違いにより、文字化けの原因となる場合がある。
「~」の全角文字が「~」なのか、ということが根本にあり、シフトJISからUnicodeに変換した場合の0x301Cは「WAVE DASH」、CP932からUnicodeに変換した場合の0xFF5Eは「FULLWIDTH TILDE」という名称が付けられている。
このふたつは別の文字であり、後者の方が「~」に近く、前者は「~」を上下逆にしたものである。この変換の解釈の違いがこの問題の元である。「似たような文字だからどっちでもいいじゃん」という気もするが、文字化けやバグの原因となる非常に大きな問題である。
詳しくは「CP932」の項目を参考のこと。
上記の英語名称から、この問題を「WAVE DASH - FULLWIDTH TILDE問題」、「WAVE DASH問題」、「FULLWIDTH TILDE問題」と言うこともある。
対策のひとつとして、「~」に置き換えてしまうという方法もある。
YahooやAmazonはそうしている。
「-」に置き換えると意味がないので注意。
参考サイト
// Sample.java
import java.io.UnsupportedEncodingException;
// Sample.java
public class Sample
{
public static void main( String[] args )
{
try
{
// 「~」(0x81,0x60)の場合。
byte[] bytes = new byte[] { (byte)0x81, (byte)0x60 };
// シフトJISとして変換すると、文字化けしてしまいます。
String shiftJis = new String( bytes, "Shift_JIS" );
System.out.println( shiftJis );
System.out.println( Integer.toHexString( shiftJis.charAt( 0 ) ) );
// ?
// 301c
// CP932(IANAに登録している名前は"Windows-31J")なら変換できます。
String windows31J = new String( bytes, "Windows-31J" );
System.out.println( windows31J );
System.out.println( Integer.toHexString( windows31J.charAt( 0 ) ) );
// ~
// ff5e
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「Shift_JIS」や「Windows-31J」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
}
}
import java.io.UnsupportedEncodingException;
// Sample.java
public class Sample
{
public static void main( String[] args )
{
try
{
// 「~」(0x81,0x60)の場合。
byte[] bytes = new byte[] { (byte)0x81, (byte)0x60 };
// シフトJISとして変換すると、文字化けしてしまいます。
String shiftJis = new String( bytes, "Shift_JIS" );
System.out.println( shiftJis );
System.out.println( Integer.toHexString( shiftJis.charAt( 0 ) ) );
// ?
// 301c
// CP932(IANAに登録している名前は"Windows-31J")なら変換できます。
String windows31J = new String( bytes, "Windows-31J" );
System.out.println( windows31J );
System.out.println( Integer.toHexString( windows31J.charAt( 0 ) ) );
// ~
// ff5e
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「Shift_JIS」や「Windows-31J」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
}
}
// Sample.java import java.io.UnsupportedEncodingException; // Sample.java public class Sample { public static void main( String[] args ) { try { // 「~」(0x81,0x60)の場合。 byte[] bytes = new byte[] { (byte)0x81, (byte)0x60 }; // シフトJISとして変換すると、文字化けしてしまいます。 String shiftJis = new String( bytes, "Shift_JIS" ); System.out.println( shiftJis ); System.out.println( Integer.toHexString( shiftJis.charAt( 0 ) ) ); // ? // 301c // CP932(IANAに登録している名前は"Windows-31J")なら変換できます。 String windows31J = new String( bytes, "Windows-31J" ); System.out.println( windows31J ); System.out.println( Integer.toHexString( windows31J.charAt( 0 ) ) ); // ~ // ff5e } catch( UnsupportedEncodingException e ) { // StringクラスのコンストラクタがUnsupportedEncodingException例外を // 投げるので拾います。第2引数で渡された文字コード // (上記の例では「Shift_JIS」や「Windows-31J」)が、Javaではサポート // されていない文字コードの場合にエラーとなります。 e.printStackTrace(); } } }