Created
March 13, 2014 14:36
-
-
Save phpusr/9529689 to your computer and use it in GitHub Desktop.
Класс для конвертирования символьных данных, которые получаются из Glyph-индексов в нормальные символы
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.phpusr.glyph | |
/** | |
* @author phpusr | |
* Date: 12.03.14 | |
* Time: 14:16 | |
*/ | |
/** | |
* Класс для конвертирования символьных данных, которые получаются из Glyph-индексов | |
* в нормальные символы | |
*/ | |
class GlyphToCharDecoder { | |
/** Хэш-мап для конвертирования символов */ | |
private static Map<Integer, String> decodingMap = createDecodingMap() | |
/** Добавлять ли символы записанные под Unicode-индексами */ | |
private static final ADD_UNICODE = false | |
/** Включена-ли отладка */ | |
private static final DEBUG_MODE = false | |
/** | |
* Конвертирует строку состояющую из индексов Glyph, в нормальную строку | |
* Для конвертирования используются индексы шрифта Courier New | |
*/ | |
static String decodeString(String encodeMessage) { | |
StringBuilder decodeMessage = new StringBuilder() | |
for(int i=0; i<encodeMessage.length(); i++) { | |
char symbol = encodeMessage.charAt(i) | |
decodeMessage << decodeChar(symbol) | |
} | |
return decodeMessage.toString() | |
} | |
/** | |
* Конвертирует символ, который получается из Glyph индекса, в нормальный символ | |
* Для конвертирования используются индексы шрифта Courier New | |
*/ | |
static String decodeChar(char symbol) { | |
int symbolIndex = symbol as int | |
String decodeSymbol = decodingMap.get(symbolIndex) | |
//Для отладки: выводит индексы не распознанных символов | |
if (DEBUG_MODE && !decodeSymbol) { | |
println "null: $symbolIndex" | |
} | |
return decodeSymbol | |
} | |
/** | |
* Создает хэш-мап соответствий индексов, символам | |
* Часть символом записывается под Glyph-индексами, а часть под Unicode | |
* (Так сделано потому, что в файле присутствоет и то, и другое) | |
* Для конвертирования используются индексы шрифта Courier New | |
*/ | |
private static Map<Integer, String> createDecodingMap() { | |
Map map = [:] | |
int startIndex = 0 | |
if (ADD_UNICODE) { | |
//Добавление символов, записываемых под Unicode-индексами | |
//В начале, чтобы индексы могли быть перезаписаны позже | |
putUnicodeSymbols(map) | |
} | |
//Добавление разных знаков | |
def otherSymbols = [3: ' ', 11: '(', 12: ')', 16: '-', 18: '/'] as Map<Integer, String> | |
map.putAll(otherSymbols) | |
//Добавление цифр | |
def numbers = 0..9 | |
startIndex = 19 | |
numbers.each { num-> | |
map.put(startIndex++, num.toString()) | |
} | |
//Добавление русских букв, сначало строчных, затем прописных | |
def russianSymbols = ['а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', 'ё'] | |
startIndex = 570 | |
russianSymbols.each { symbol -> | |
map.put(startIndex++, symbol.toUpperCase()) | |
} | |
russianSymbols.each { symbol -> | |
map.put(startIndex++, symbol) | |
} | |
return map | |
} | |
/** Добавляет в хэш-мап символы, записывая их под Unicode-индексами */ | |
private static void putUnicodeSymbols(Map<Integer, String> map) { | |
//Добавление разных знаков | |
def otherSymbols = [32: ' ', 40: '(', 41: ')', 45: '-'] as Map<Integer, String> | |
map.putAll(otherSymbols) | |
//Добавление английских букв, сначало строчных, затем прописных | |
def englishSymbols = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] | |
int startIndex = 65 | |
englishSymbols.each { symbol -> | |
map.put(startIndex++, symbol.toUpperCase()) | |
} | |
startIndex = 87 | |
englishSymbols.each { symbol -> | |
map.put(startIndex++, symbol) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment