読者です 読者をやめる 読者になる 読者になる

ゲンゾウ用ポストイット

Java、Groovy、Linux関連の備忘録

GradleでGoogleCodeプロジェクトを作ってみる - その2

Gradle Groovy

前回に引き続き、空のプロジェクトができたところからスタート。
文字コード変換用のライブラリだが、判定ロジックなど僕のスキルでは書くことができないので以下のプロジェクトのリソースを拝借した。
juniversalchardet - Java port of universalchardet - Google Project Hosting
こちらを、javaフォルダに配置。

gconv
`-- src
    `-- main
        `-- java

次にjuniversalchardetのクラスのラッパーを作成。これでいかにも自分が作成したっぽくなる。
バイト配列をもらって、それがどの文字コードであるかを自動判定する。
(ただし、半角英数字のみの場合、うまく判定ができない。juniversalchardetの仕様の模様)

gconv
`-- src
    `-- main
        `-- groovy
            `-- com
                `-- gmail
                    `-- genzouw
                        `-- gconv
                            `-- Gconv.groovy
Gconv.groovy
package com.gmail.genzouw.gconv

import org.mozilla.universalchardet.Constants

class Gconv{
	private detector = null

	class Charset{
		private Charset(){}
		static final String ISO_2022_JP = Constants.CHARSET_ISO_2022_JP
		static final String ISO_2022_CN = Constants.CHARSET_ISO_2022_CN
		static final String ISO_2022_KR = Constants.CHARSET_ISO_2022_KR
		static final String ISO_8859_5 = Constants.CHARSET_ISO_8859_5
		static final String ISO_8859_7 = Constants.CHARSET_ISO_8859_7
		static final String ISO_8859_8 = Constants.CHARSET_ISO_8859_8
		static final String BIG5 = Constants.CHARSET_BIG5
		static final String GB18030 = Constants.CHARSET_GB18030
		static final String EUC_JP = Constants.CHARSET_EUC_JP
		static final String EUC_KR = Constants.CHARSET_EUC_KR
		static final String EUC_TW = Constants.CHARSET_EUC_TW
		static final String SHIFT_JIS = Constants.CHARSET_SHIFT_JIS
		static final String IBM855 = Constants.CHARSET_IBM855
		static final String IBM866 = Constants.CHARSET_IBM866
		static final String KOI8_R = Constants.CHARSET_KOI8_R
		static final String MACCYRILLIC = Constants.CHARSET_MACCYRILLIC
		static final String WINDOWS_1251 = Constants.CHARSET_WINDOWS_1251
		static final String WINDOWS_1252 = Constants.CHARSET_WINDOWS_1252
		static final String WINDOWS_1253 = Constants.CHARSET_WINDOWS_1253
		static final String WINDOWS_1255 = Constants.CHARSET_WINDOWS_1255
		static final String UTF_8 = Constants.CHARSET_UTF_8
		static final String UTF_16BE = Constants.CHARSET_UTF_16BE
		static final String UTF_16LE = Constants.CHARSET_UTF_16LE
		static final String UTF_32BE = Constants.CHARSET_UTF_32BE
		static final String UTF_32LE  = Constants.CHARSET_UTF_32LE
	}

	private static Gconv SELF = new Gconv()

	private Gconv(){
		detector = new org.mozilla.universalchardet.UniversalDetector()
	}

	static Gconv getInstance(){
		SELF
	}

	String guess(byte[] bytes){
		detector.with{
			reset()
			handleData(bytes as byte[], 0, bytes.size())
			dataEnd()
		}

		detector.detectedCharset
	}

	byte[] gconv(byte[] bytes, outCode, inCode=null){
		if( !inCode ) {
			inCode = this.guess(bytes)
		}

		inCode ? new String(bytes, inCode).getBytes(outCode) : bytes
	}

	byte[] toEuc(byte[] bytes){
		this.gconv(bytes, Charset.EUC_JP)
	}

	byte[] toSjis(byte[] bytes){
		this.gconv(bytes, Charset.SHIFT_JIS)
	}

	byte[] toUtf8(byte[] bytes){
		this.gconv(bytes, Charset.UTF_8)
	}

	boolean isEuc(byte[] bytes){
		this.guess(bytes) == Charset.EUC_JP
	}

	boolean isSjis(byte[] bytes){
		this.guess(bytes) == Charset.SHIFT_JIS
	}

	boolean isUtf8(byte[] bytes){
		this.guess(bytes) == Charset.UTF_8
	}

}
テスト

testフォルダ以下にテストコードとテストに使用するリソースファイルを配置。

gconv
`-- src
    |
    `-- test
        |-- groovy
        |   `-- com
        |       `-- gmail
        |           `-- genzouw
        |               `-- gconv
        |                   `-- GconvTest.groovy
        `-- resources
            `-- txt
                |-- euc.txt
                |-- iso2022jp.txt
                |-- shiftjis.txt
                |-- utf16le.txt
                |-- utf8.txt
                `-- utf8n.txt
GconvTest.groovy
package com.gmail.genzouw.gconv

import groovy.util.GroovyTestCase

class GconvTest extends GroovyTestCase {
	def gconv = null

	void setUp(){
	    gconv = Gconv.instance
	}

	void test_guess_utf8(){
		def utf8bytes = new File("src/test/resources/txt/utf8.txt").bytes
		assertEquals(Gconv.Charset.UTF_8, gconv.guess(utf8bytes))
	}
	void test_guess_euc(){
		def eucbytes = new File("src/test/resources/txt/euc.txt").bytes
		assertEquals(Gconv.Charset.EUC_JP, gconv.guess(eucbytes))
	}
	void test_guess_sjis(){
		def sjisbytes = new File("src/test/resources/txt/shiftjis.txt").bytes
		assertEquals(Gconv.Charset.SHIFT_JIS, gconv.guess(sjisbytes))
	}

	void test_isUtf8(){
		def bytes = new File("src/test/resources/txt/utf8.txt").bytes
		assertTrue(gconv.isUtf8(bytes))
		assertFalse(gconv.isEuc(bytes))
		assertFalse(gconv.isSjis(bytes))
	}
	void test_isEuc(){
		def bytes = new File("src/test/resources/txt/euc.txt").bytes
		assertFalse(gconv.isUtf8(bytes))
		assertTrue(gconv.isEuc(bytes))
		assertFalse(gconv.isSjis(bytes))
	}
	void test_isSjis(){
		def bytes = new File("src/test/resources/txt/shiftjis.txt").bytes
		assertFalse(gconv.isUtf8(bytes))
		assertFalse(gconv.isEuc(bytes))
		assertTrue(gconv.isSjis(bytes))
	}

	void test_fromEucToSjis_size(){
		def sjisbytes = new File("src/test/resources/txt/shiftjis.txt").bytes
		def eucbytes = new File("src/test/resources/txt/euc.txt").bytes
		assertEquals(sjisbytes, gconv.toSjis(eucbytes))
	}

	void test_resourcesValid(){
		def sjisbytes = new File("src/test/resources/txt/shiftjis.txt").bytes.toList()
		def eucbytes = new File("src/test/resources/txt/euc.txt").bytes.toList()
		def utf8bytes = new File("src/test/resources/txt/utf8.txt").bytes.toList()
		def utf8nbytes = new File("src/test/resources/txt/utf8n.txt").bytes.toList()
		assertFalse(sjisbytes == eucbytes)
		assertFalse(sjisbytes == utf8bytes)
		assertFalse(sjisbytes == utf8nbytes)
		assertFalse(utf8nbytes == eucbytes)
		assertFalse(utf8nbytes == utf8bytes)
		assertFalse(eucbytes == utf8bytes)
	}
}

ビルド

ビルドはGradleで行う。

以下のコマンドを実行。

ビルド
$ gradle build
:compileJava
:compileGroovy
:processResources
:classes
:jar
:assemble
:compileTestJava
:compileTestGroovy
:processTestResources
:testClasses
:test
:check
:build

BUILD SUCCESSFUL

JUnitがインストールされていなくても動作はする。

Subversionへのコミット

変更内容をローカルGitへコミット。

$ git add .
$ git commit -m "文字コード判定、変換クラスGconvを追加。"

これをGoogle Code Subversionリポジトリへコミット。

git svn dcommit


無事コミットできた。今日はここまで。
この後、Google Code上にGrapeを作ってgconvを利用できるように公開してみる。

広告を非表示にする