From: yukihane Date: Mon, 19 Mar 2012 13:05:09 +0000 (+0900) Subject: nicocache文字列置換方法を追加 X-Git-Tag: rel20120512_ver0.12.0~5 X-Git-Url: http://git.osdn.net/view?p=coroid%2FNicoBrowser.git;a=commitdiff_plain;h=303ee8ae9bc376c53f5d6bb37f556a2c337a47fd nicocache文字列置換方法を追加 --- diff --git a/src/nicobrowser/NamePattern.java b/src/nicobrowser/NamePattern.java index a0ac37a..365eb0a 100644 --- a/src/nicobrowser/NamePattern.java +++ b/src/nicobrowser/NamePattern.java @@ -1,5 +1,9 @@ package nicobrowser; +import java.io.UnsupportedEncodingException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * * @author yuki @@ -9,6 +13,7 @@ public class NamePattern { 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 = ""; @@ -22,6 +27,7 @@ public class NamePattern { /** * 保存ファイル名の命名規則. + * * @param pattern 命名パターン. * @param replaceFrom 禁則文字を指定する. * @param replaceTo 禁則文字をこの文字列に置換する. @@ -89,6 +95,84 @@ public class NamePattern { } 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; } } diff --git a/test/nicobrowser/NamePatternTest.java b/test/nicobrowser/NamePatternTest.java index 2a3e086..59ea520 100644 --- a/test/nicobrowser/NamePatternTest.java +++ b/test/nicobrowser/NamePatternTest.java @@ -27,15 +27,15 @@ public class NamePatternTest { 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); } }