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