The testbed tests Chinese characters, using UTF-8. Does that not work?
I thought UTF-8 had bigger tha 8 bit characters.... ?
geir
Michael Zhou wrote:
>
> Hi guys,
>
> I'm pleased to see velocity 1.1-rc1 released. It can specify template-based
>encoding method, which is very useful to internatinal applications. Unfortunitely,
>there's still a bug(i think, maybe it's not velocity's bug, it's about JavaCC). How
>can velocity process international characters such as Chinese? I modified the
>input.encoding=GBK property in velocity.properties file, to make it recogonize
>Chinese. It seems work well, until it saw a Chinese character (U+4e0a). Velocity
>complained it encountered a "\n" after double-quote. Ya, it's velocity(javacc) masks
>the higher byte, so it considered (U+4e0a) as (U+000a), which is same as "\n".
>
> I tried to correct this by adding a new line "UNICODE_INPUT=true" in
>"org/apache/velocity/runtime/parser/Parser.jjt" file, and rebuild the velocity. So
>that JavaCC generates "UCode_CharStream.java" instead of "ASCII_CharStream.java".
>But the result becomes more strange! Because javacc eats every 2 characters and
>combines them as one character regardless of you initialize the parser by a
>byte-based stream or character-based reader! Finally, I found the solution.
>
> * First, add option "UNICODE_INPUT=true" to Parser.jjt, and execute the "build"
>shell in "/org/apache/velocity/runtime/parser" directory. Then it will generate a
>file UCode_CharStream.java.
>
> * Replace the UCode_CharStream.java with original ASCII_CharStream.java by shell
>command: mv ASCII_CharStream.java UCode_CharStream.java
>
> * Modify the UCode_CharStream.java by vi UCode_CharStream.java
> 1. replace the class name and constructor names with UCode_CharStream.
> 2. modify lines below in the method readChar(), so that it can process UNICODE
>correctly.
> change: return (char)((char)0xff & buffer[(bufpos == bufsize - 1) ? (bufpos
>= 0) : ++bufpos]);
> to: return buffer[(bufpos == bufsize - 1) ? (bufpos = 0) :
>++bufpos];
> change: char c = (char)((char)0xff & buffer[bufpos]);
> to: char c = buffer[bufpos];
>
> * Use of "USER_CHAR_STREAM=true" in javacc is also work.
>
> Now i think the product is perfect!
>
> Michael Zhou
--
Geir Magnusson Jr. [EMAIL PROTECTED]
System and Software Consulting
Developing for the web? See http://jakarta.apache.org/velocity/
"still climbing up to the shoulders..."