+ return getSanitizedDescription(str.toString());
+ }
+
+ public static String getSanitizedDescription(String decodedDesc) {
+ String fileNameCharset = System.getProperty("file.encoding");
+
+ String narrowedDesc = narrowCharset(decodedDesc, fileNameCharset);
+
+ // 実体参照を更に実体参照するケースがあるので二回置換する
+ narrowedDesc = replaceER(replaceER(narrowedDesc));
+
+ char descArray[] = narrowedDesc.toCharArray();
+
+ for (int i = 0; i < descArray.length; i++) {
+ char c = descArray[i];
+ switch (c) {
+ case '\\':
+ case '\u00a5':
+ c = '¥';
+ break;
+ case '/':
+ c = '/';
+ break;
+ case ':':
+ c = ':';
+ break;
+ case '*':
+ c = '*';
+ break;
+ case '?':
+ c = '?';
+ break;
+ case '"':
+ c = '”';
+ break;
+ case '<':
+ c = '<';
+ break;
+ case '>':
+ c = '>';
+ break;
+ case '|':
+ c = '|';
+ break;
+ case '\u203e':// c = '~'; break;
+ case '\u301c':// c = '~'; break;
+ case '\u2016':
+ case '\u2212':
+ case '\u00a2':
+ case '\u00a3':
+ case '\u00ac':
+ c = '-';
+ break;
+ }
+
+ descArray[i] = c;
+ }
+ return new String(descArray);
+ }
+
+ private static String replaceER(String src) {
+ return src.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll(""", "\"").
+ replaceAll("'", "'");
+ }
+
+ // 一旦目的の文字コードにしてから戻して、対応してない文字を '?' にする
+ static String narrowCharset(String str, String charsetName) {
+ String narrowedDesc = str;
+ if (!charsetName.equals("")) {
+ try {
+ narrowedDesc =
+ new String(str.getBytes(charsetName), charsetName);
+ // characters which are not supported by the charset
+ // become '?'
+ } catch (UnsupportedEncodingException e) {
+ log.warn(e.toString());
+ }
+ }
+ return narrowedDesc;