How-to: input/output "Japanese Characters"?
Georg Wrede
georg.wrede at iki.fi
Sun May 3 09:22:05 PDT 2009
Carlos Smith wrote:
> "Georg Wrede" <georg.wrede at iki.fi> a écrit dans le message de news:
>
>> import std.stdio;
>>
>> void main()
>> {
>> auto lin = readln();
>> writeln(lin);
>> }
>>
>> Works with your Japanese strings. It just works(tm).
>
> I am trying this on a North American WinXP station.
> I am using DMD V1.
Sorry, somebody else has to help, I'm not using Windows. :/
> You will find a small program at the end of this
> message who does not work for me.
>
> The console use Lucida COnsole font. The CP is 65001.
> cmd.exe can read/write utf strings, but not my
> program.
>
> I want to be able to read an utf string from stdin.
> That string will contains characters > 256, ie glyphs
> you can only see with an unicode font.
>
> I have read some documentation on MSDN that confirm
> it can't work. So why does it work for you ?
>
> Can anyone, explain to me what am i doing wrong ?
>
> Thanks a lot...
>
> --------- program ----------
> //
> // readln.d
> // testing readln()
> //
> // This file saved with BOM: FF FE
> // Edit with Lucida Console font
> //
>
> import std.stdio;
> import std.c.windows.windows;
> import std.c.locale;
> import std.utf;
>
> extern( Windows )
> {
> HANDLE GetStdHandle( DWORD nStdHandle );
> BOOL WriteConsoleW(
> HANDLE hConsoleOutput,
> in VOID* lpBuffer,
> DWORD nNumberOfCharsToWrite,
> DWORD* lpNumberOfCharsWritten,
> void* lpReserved = null );
> BOOL WriteConsoleA(
> HANDLE hConsoleOutput,
> in VOID* lpBuffer,
> DWORD nNumberOfCharsToWrite,
> DWORD* lpNumberOfCharsWritten,
> void* lpReserved = null );
> BOOL ReadConsoleW( HANDLE hConsoleInput, LPVOID lpBuffer, uint
> nNumberOfCharsToRead,
> uint* lpNumberOfCharsRead, void* pInputControl = null );
> BOOL ReadConsoleA( HANDLE hConsoleInput, LPVOID lpBuffer, uint
> nNumberOfCharsToRead,
> uint* lpNumberOfCharsRead, void* pInputControl = null );
> version (UNICODE)
> alias ReadConsoleA ReadConsole;
> else
> alias ReadConsoleW ReadConsole;
> }
>
>
> UINT CP, OCP;
>
> void DisplayCP()
> {
> writef("Console CP: %s\n", GetConsoleCP());
> writef("Console Output CP: %s\n", GetConsoleOutputCP());
> }
>
> void SaveCP()
> {
> CP = GetConsoleCP();
> OCP = GetConsoleOutputCP();
> }
>
> void SetUnicode()
> {
> SetConsoleCP( 65001 );
> SetConsoleOutputCP( 65001 );
> }
>
> void ResetCP()
> {
> SetConsoleCP( CP );
> SetConsoleOutputCP( OCP );
> }
>
> int main( )
> {
> HANDLE cout;
> DWORD nw;
> cout = GetStdHandle(STD_OUTPUT_HANDLE);
>
> DisplayCP();
> SaveCP();
> SetUnicode();
> DisplayCP();
>
> // writef() do print Unicode string constant
> // next 5 lines contains utf chars.
> wchar[] utfstr = "←↑→↔↨∂∆∏∑−√∞∟∩∫≈═┼┴⌠⌐≥≤≡≠ѕєіїњљ\n";
> writef("1: %s","←↑→↔↨∂∆∏∑−√∞∟∩∫≈═┼┴⌠⌐≥≤≡≠ѕєіїњљ\n");
> writef("2: %s",utfstr);
> // so do WriteConsoleW()
> wchar[] utfstr3 = "3: ←↑→↔↨∂∆∏∑−√∞∟∩∫≈═┼┴⌠⌐≥≤≡≠ѕєіїњљ\n";
> WriteConsoleW(cout, utfstr3.ptr, utfstr3.length, &nw);
>
> // but not readln()`ed strings
> writef("Type a line of Unicode characters:\n");
> auto line = readln();
> writef("line len: %s\n", line.length);
> writef("%s\n", "Next line is what You typed:");
> writef("%s\n",line);
> writef("%s\n", "Your line again (with WriteConsoleA):");
> WriteConsoleA(cout, line.ptr, line.length, &nw);
> writef("%s\n", "Your line again (with WriteConsoleW):");
> WriteConsoleW(cout, line.ptr, line.length, &nw);
>
>
> writef("Done. Resetting code page.\n");
> ResetCP();
> DisplayCP();
> return 0;
> }
> --------- eof ---------
>
More information about the Digitalmars-d-learn
mailing list