package nicobrowser;
+import java.io.UnsupportedEncodingException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
/**
*
* @author yuki
private static final String titlePattern = "{title}";
private static final String idPattern = "{id}";
private static final String lowPattern = "{low}";
+ private static Logger log = LoggerFactory.getLogger(NamePattern.class);
private final String pattern;
private String replaceFrom = "";
private String replaceTo = "";
/**
* 保存ファイル名の命名規則.
+ *
* @param pattern 命名パターン.
* @param replaceFrom 禁則文字を指定する.
* @param replaceTo 禁則文字をこの文字列に置換する.
}
str.append(moji);
}
- return str.toString();
+ 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;
}
}
NamePattern np2 = new NamePattern("[{id}]{title}", "9タ", "-", title);
res = np2.createFileName(id, false);
- assertEquals("[sm----]*-\\イ/ト\"ル", res);
+ assertEquals("[sm----]*-¥イ/ト”ル", res);
NamePattern np3 = new NamePattern("{id}{low}_{title}", "", "", title);
res = np3.createFileName(id, false);
- assertEquals("sm9999low_*タ\\イ/ト\"ル", res);
+ assertEquals("sm9999low_*タ¥イ/ト”ル", res);
NamePattern np4 = new NamePattern("{id}{low}_{title}", "/*-", "*", title);
res = np4.createFileName(id, true);
- assertEquals("sm9999_*タ\\イ*ト\"ル", res);
+ assertEquals("sm9999_*タ¥イ*ト”ル", res);
}
}