uniquejava / blog

My notes regarding the vibrating frontend :boom and the plain old java :rofl.
Creative Commons Zero v1.0 Universal
11 stars 5 forks source link

Shift_JIS #272

Open uniquejava opened 5 years ago

uniquejava commented 5 years ago

https://qiita.com/yoshi389111/items/9060c8b62df7cac31de9

http://pentan.info/doc/unicode_list.html

https://docs.oracle.com/cd/E19253-01/819-0364/apptbl1/index.html

https://stackoverflow.com/questions/2183240/java-integer-to-byte-array

uniquejava commented 5 years ago

代码来自: https://qiita.com/ryuumikoto/items/2c884b3dfbb228ac1065

package com.ibm.wes.service;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class StringEncoder {

    /**
     * 引数の文字列(Shift_JIS)を、UTF-8にエンコードする。
     *
     * @param value 変換対象の文字列
     * @return エンコードされた文字列
     */
    public static String sjisToUtf8(String value) throws UnsupportedEncodingException {
        byte[] srcStream = value.getBytes("SJIS");
        byte[] destStream = (new String(srcStream, "SJIS")).getBytes("UTF-8");
        value = new String(destStream, "UTF-8");
        value = StringEncoder.convert(value, "SJIS", "UTF-8");
        return value;
    }

    /**
     * 引数の文字列(UTF-8)を、Shift_JISにエンコードする。
     *
     * @param value 変換対象の文字列
     * @return エンコードされた文字列
     */
    public static String utf8ToSjis(String value) throws UnsupportedEncodingException {
        byte[] srcStream = value.getBytes("UTF-8");
        value = convert(new String(srcStream, "UTF-8"), "UTF-8", "SJIS");
        byte[] destStream = value.getBytes("SJIS");
        value = new String(destStream, "SJIS");
        return value;
    }

    /**
     * 引数の文字列を、エンコードする。
     *
     * @param value 変換対象の文字列
     * @param src   変換前の文字コード
     * @param dest  変換後の文字コード
     * @return エンコードされた文字列
     */
    private static String convert(String value, String src, String dest) throws UnsupportedEncodingException {
        Map<String, String> conversion = createConversionMap(src, dest);
        char oldChar;
        char newChar;
        String key;
        for (Iterator<String> itr = conversion.keySet().iterator(); itr.hasNext(); ) {
            key = itr.next();
            oldChar = toChar(key);
            newChar = toChar(conversion.get(key));

            System.out.println(key);
            System.out.println(oldChar);
            System.out.println(newChar);
            value = value.replace(oldChar, newChar);
        }
        return value;
    }

    /**
     * エンコード情報を作成する
     *
     * @param src  変換前の文字コード
     * @param dest 変換後の文字コード
     * @return エンコードされた文字列
     */
    private static Map<String, String> createConversionMap(String src, String dest) throws UnsupportedEncodingException {
        Map<String, String> conversion = new HashMap<String, String>();
        if ((src.equals("UTF-8")) && (dest.equals("SJIS"))) {
            // -(全角マイナス)
            conversion.put("U+FF0D", "U+2212");
            // ~(全角チルダ)
            conversion.put("U+FF5E", "U+301C");
            // ¢(セント)
            conversion.put("U+FFE0", "U+00A2");
            // £(ポンド)
            conversion.put("U+FFE1", "U+00A3");
            // ¬(ノット)
            conversion.put("U+FFE2", "U+00AC");
            // ―(全角マイナスより少し幅のある文字)
            conversion.put("U+2015", "U+2014");
            // ∥(半角パイプが2つ並んだような文字)
            conversion.put("U+2225", "U+2016");

        } else if ((src.equals("SJIS")) && (dest.equals("UTF-8"))) {
            // -(全角マイナス)
            conversion.put("U+2212", "U+FF0D");
            // ~(全角チルダ)
            conversion.put("U+301C", "U+FF5E");
            // ¢(セント)
            conversion.put("U+00A2", "U+FFE0");
            // £(ポンド)
            conversion.put("U+00A3", "U+FFE1");
            // ¬(ノット)
            conversion.put("U+00AC", "U+FFE2");
            // ―(全角マイナスより少し幅のある文字)
            conversion.put("U+2014", "U+2015");
            // ∥(半角パイプが2つ並んだような文字)
            conversion.put("U+2016", "U+2225");

        } else {
            throw new UnsupportedEncodingException("この文字コードはサポートしていません。\n・src=" + src + ",dest=" + dest);
        }
        return conversion;
    }

    /**
     * 16進表記の文字を取得する。
     *
     * @param value 変換対象の文字列
     * @return 16進表記の文字
     */
    private static char toChar(String value) {
        return (char) Integer.parseInt(value.trim().substring("U+".length()), 16);
    }

    public static void main(String[] args) throws Exception {
        File inputFile = new File("/Users/xx/tmp1/input.txt");
        File outputFile = new File("/Users/xx/tmp1/output.txt");
        FileUtils.writeStringToFile(outputFile, FileUtils.readFileToString(inputFile, "UTF-8"), "MS932");

//        String str = FileUtils.readFileToString(inputFile, "UTF-8").trim();
//
//
//
//        byte[] utf8 = str.getBytes("UTF-8");
//        byte[] sjis = str.getBytes("SHIFT-JIS");
//
//
//        byte[] output = new byte[]{(byte)0xfa, (byte)0x40};
//        FileUtils.writeByteArrayToFile(outputFile, output);

    }
}