Thursday, December 23, 2010

ಕನ್ನಡ (ಯುನಿಕೋಡ್) ಕಡತಗಳಿಗಾಗಿ java.util.properties

ತೇಲುವ ಚುಕ್ಕಿಯ ಬಗ್ಗೆಯ ಬರಹಗಳನ್ನ ಮುಂದುವರೆಸುವುದಕ್ಕೆ ಮೊದಲು, ಒಂದು ಹಮ್ಮು ಹಂಚಿಕೊಳ್ಳೋಣ ಅಂತ ಅಂದುಕೊಂಡೆ. ಆದರೆ ಇದು ಜಾವ ಹಮ್ಮುಗ(programmer)ರಿಗೆ ಮಾತ್ರ.

ಇತ್ತೀಚಿಗೆ ವಿಕ್ಷನರಿಗೆ ಒರೆಗಳನ್ನು ಸೇರಿಸುವ ಮೊರೆ / ಪರಿವಿಡಿ(procedure)ಯನ್ನು ತನ್ನಡೆಸು(automate)ವ ಹೊಣೆಯನ್ನು ನನಗೆ ಸಂಜೀವ್ ವಹಿಸಿದರು. ಅದಕ್ಕಾಗಿ ಒಂದು ಸಣ್ಣ ಹಮ್ಮು ಬರೆದೆ, ಜಾವದಲ್ಲಿ. ಕೆಲವು ಒಳುಪುಗಳನ್ನು(properties) ಉಳಿಸಿಡಲು ಒಂದು .properties ಕಡತವನ್ನು ಬರೆದು ಅದರಲ್ಲಿ ಕೆಲವು ಕನ್ನಡದ ಬೆಲೆ(value)ಗಳನ್ನು ಬಳಸಿದೆ. ಅಂದರೆ ಕನ್ನಡ ಯುನಿಕೋಡ್ ಲಿಪಿಯಲ್ಲಿ ಬೆಲೆಗಳನ್ನು ಹಾಕಿದೆನು. ಆ ಕಡತದ ಒಳಪಿಡಿ(contents) ಹೀಗಿತ್ತು ನೋಡಿ:

###
username=username
password=password
search_prefix=ಕ
wiki=kn.wiktionary.org
output_file=out.txt

ನಾನು ಬರೆದ ಹಮ್ಮು (program) ಮಾಡಬೇಕಾಗಿದ್ದು ಇಶ್ಟು: ಈ ಕಡತದಲ್ಲಿ ಕೊಟ್ಟಿರುವ ಬಳಕೆಗಾರ-ಹೆಸರು (username) ಮತ್ತು ತೇರ್ಪದ(password)ವನ್ನು ಬಳಸಿ ವಿಕ್ಷನರಿಯನ್ನು ಹೊಕ್ಕು (login) 'ಕ' ಬರಿಗೆ(ಅಕ್ಷರ)ಯಿಂದ ಮೊದಲಾಗುವ ಎಲ್ಲ ಪದಗಳನ್ನು ಹುಡುಕಿ out.txt ಎಂಬ ಕಡತದಲ್ಲಿ ಹಾಕಬೇಕು.

ಹಮ್ಮನ್ನು ಓಡಿಸಿದೆ, ಆದರೆ ಏನೂ ಬರಲಿಲ್ಲ :-(!!! ಸರಿ ಅಂತ ಹುಳ ತೆಗೆಯೋದಕ್ಕೆ (debug) ತೊಡಗಿದೆ. ಆಮೇಲೆ ಗೊತ್ತಾಯ್ತು, ತೊಂದರೆ ಇದ್ದಿದ್ದು ನನ್ನ ಹಮ್ಮಿನಲ್ಲಿ ಅಲ್ಲ, ಈ ಕಡತವನ್ನು ಓದಲು ಬಳಸುತ್ತಿದ್ದ java.util.Properties.load() ಕೆಲಸ(function)ದಲ್ಲಿ ಅಂತ. ಇದರ ಜಾವ ಡಾಕ್ ಹೀಗೆ ಹೇಳುತ್ತೆ:

The load(InputStream) / store(OutputStream, String) methods work the same way as the load(Reader)/store(Writer, String) pair, except the input/output stream is encoded in ISO 8859-1 character encoding. Characters that cannot be directly represented in this encoding can be written using Unicode escapes ; 

ಅಂದರೆ, ಅಯ್.ಎಸ್.ಒ ೮೮೫೯-೧ ಬರಿಗೆ(character)ಗಳು ಮಾತ್ರ ಇರುವ ಕಡತವನ್ನು ಸರಿಯಾಗಿ ಓದುತ್ತೆ. ಆದರೆ ಯುನಿಕೋಡ್ ಬರಿಗೆ ಇದ್ದಲ್ಲಿ ಅದನ್ನು ಸರಿಯಾಗಿ ಮಾರ್ಬರೆ(encode)ಯಬೇಕು. ಅಂದರೆ ಈ ಕಡತದಲ್ಲಿ 'ಕ' ಬಳಸಿದ್ದೀನಲ್ಲ ಅದನ್ನ ಯುನಿಕೋಡ್ ಪಾರು ವರಸೆ (escape sequence)ಯಾಗಿ ಮಾರ್ಬರೆ(encode)ಯಬೇಕು. ಹೀಗೆ:

search_prefix=\u0C95

ಹೀಗೆ ಮಾರ್ಪಾಡು ಮಾಡಿ ಹಮ್ಮು ಓಡಿಸಿದಾಗ 'ಕ' ಇಂದ ಮೊದಲಾಗುವ ಎಲ್ಲ ಪದಗಳು 'out.txt'ಗೆ ಬಂದು ಬಿದ್ದವು. :-)) (ಚಪ್ಪಾಳೆ!!!!)

ಆದರೆ ಲಾಟಿನ್ ಬರಿಗೆಗಳನ್ನು (latin characters) ಬಳಸದ ಕನ್ನಡದಂತಹ ಲಿಪಿಗೆ ಇದು ಕೊಂಚ ತೊಡಕಿನ ಸಂಗತಿ. ಯುನಿಕೋಡ್ ಬರಿಗೆಗಳನ್ನು ಮಾರ್ಬರೆ(encode)ಯದೆ ಹಾಗೇ  .properties ಕಡತದಲ್ಲಿ ಕೊಟ್ಟಿದ್ದನ್ನು ಓದಿ ಬಳಸಬಲ್ಲ ನನ್ನದೇ ಆದ ಒಂದು Properties class ಅನ್ನು ಬರೆದೆ. ಯಾರದೂ ಹಂಗು ಬೇಡ ಅಂತ :-). ಕೆಳಗೆ ಅದರ ಹಮ್ಮು ಹಾಕಿದ್ದೀನಿ. ಇನ್ಮೇಲೆ .properties ಕಡತದಲ್ಲಿ ಕನ್ನಡ ಇಲ್ಲವೇ ಯಾವುದೇ ಯುನಿಕೋಡ್ ಬರಿಗೆಗಳನ್ನು ಬಳಸಬೇಕಾದಾಗ ಪಾರು ವರಸೆ (escape sequence)ಗಳ ಬಗ್ಗೆ ತಲೆ ಕೆಡಿಸ್ಕೊಳ್ಳೋದು ಬೇಡ. ಬಳಸಿ, ಹಾಗೇ ಹಂಚಿಕೊಳ್ಳಿ.





import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;


public class Properties extends java.util.Properties {

@Override
public void load(InputStream in) throws IOException {

String propertiesText = getUnicodeEscapedContentFrom(in);

InputStream superIn = new ByteArrayInputStream(propertiesText.getBytes());
super.load(superIn);
}


private String getUnicodeEscapedContentFrom(InputStream in)
throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuffer propertiesTextBuffer = new StringBuffer("");


String line = reader.readLine();

while(line != null) {
if(!isComment(line)){
line = replaceUnicodeCharactrersWithEscapes(line);
}

propertiesTextBuffer.append(line + "\n");

line = reader.readLine();
}
return propertiesTextBuffer.toString();
}


private String replaceUnicodeCharactrersWithEscapes(String line) {
StringBuffer withUnicodeEscapes = new StringBuffer("");
for(int i = 0; i < line.length(); i++) {
withUnicodeEscapes.append(getUnicodeEscapeSequence(line.charAt(i)));
}


return withUnicodeEscapes.toString();
}


private String getUnicodeEscapeSequence(char character) {
if(character <= 255) {
return "" + character;
}
return Utils.unicodeEscapeSequence(character);
}


private boolean isComment(String line) {
line = line.replaceAll("^[\\s]*", "");
if(line.matches("^!") || line.matches("$#")) {
return true;
}
return false;
}


}

2 comments:

ಕನ್ನಡtech said...

Glossary

ಮೊರೆ / ಪರಿವಿಡಿ = procedure

ಒಳುಪು - 'ಉಳ್' ಬೇರಿನಿಂದ ಬಂದಿರುವ ಪದ. ಒಂದು ವಸ್ತು ಅದರವೇ ಆದ propertyಗಳನ್ನು ಉಳ್ಳದ್ದಾಗಿರುತ್ತೆ. ಅದಲ್ಲದೇ ಈ ಪದದ ಅರ್ಥ ಕೂಡ essence, trueness ಅಂತ. ಅದಕ್ಕೆ ಈ ಪದವನ್ನ ಬಳಸಿದ್ದೇನೆ.

ತನ್ನಡೆಸು, ತನ್ನಡೆತ = automate, automation

ಒಳಪಿಡಿ = contents

ಹೊಕ್ಕು (v) = login (v)
ಹೊಗು (n) = login (n)

ಬರಿಗೆ = letter, character

ಪಾರು ವರಸೆ = escape sequence

ಮಾರ್ಬರೆ = encode (v)
ಮಾರ್ಬರಹ = encoding (n)

ಪ್ರಶಾಂತ ಸೊರಟೂರ said...

ಕನ್ನಡTech ತುಂಬಾನೇ ಒಳ್ಳೆಯ ಪ್ರಯತ್ನ.
Techincal ವಿಷಯಗಳ ಕನ್ನಡ ಬರವಣಿಗೆ,ಹೊಸ ಪದಗಳ ಹುಟ್ಟು-ಹುಡುಕಾಟ ನೋಡಿ ಎಲ್ಲಿಲ್ಲದ ಸಂತೋಷವಾಯಿತು ;-)
ಇಂಗ್ಲೀಷ ಪದಗಳಿಗೆ ಕನ್ನಡದ್ದೇ (ಸಂಸ್ಕೃತಕ್ಕೆ ಜೋತುಬೀಳದೆ) ಪದಗಳ ಹುಡುಕಾಟ ಮೆಚ್ಚುಗೆಯಾಯಿತು.

ವಂದನೆಗಳು,
ಪ್ರಶಾಂತ ಸೊರಟೂರ