Autor Wątek: Wolna konsola - jak przyśpieszyć?  (Przeczytany 6984 razy)

Offline Xender

  • Użytkownik

# Kwiecień 02, 2013, 16:53:11
@up - AFAIK to nie UTF-16, tylko UCS-2, czyli nie obejmuje całego Unicode. Wybrali takiego potworka, bo UTF-8 wtedy nie istniało, albo było bardzo młode i wydawało im się, że sprawiałoby problemy - jak historia pokazała, jednak nie sprawiało. Więc lepiej zostawić te Windosowe widechary w spokoju i korzystać z normalnych, jednobajtowych charów z tekstem i stroną kodową UTF-8.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kos

  • Użytkownik
    • kos.gd

# Kwiecień 02, 2013, 18:13:41
@up Aithne mi kiedyś wytknęła, że od Windows ileśtam (2000? Xp?) coś tam się zmieniło i jest już UTF-16. Ale nie pamiętam o co dokładnie chodziło (i.e. gdzie surrogate pairs nie były rozumiane, a teraz są).

Offline Aithne

  • Użytkownik

# Kwiecień 02, 2013, 20:31:39
Wybrali takiego potworka, bo UTF-8 wtedy nie istniało, albo było bardzo młode i wydawało im się, że sprawiałoby problemy
Wybrali takiego potworka, bo wtedy (1992-1993!) goście od unikodu myśleli, że 16 bitów na code point wystarczy im na zawsze. Jak się potem okazało, że lepszą liczbą jest 21 bitów, to był rok 1999. Microsoft nie mógł od tak złamać kompatybilności, a dodawać trzeciego zestawu funkcji (dla UTF-8 lub UTF-32) chyba nie chcieli ;)

od Windows ileśtam (2000? Xp?) coś tam się zmieniło i jest już UTF-16. Ale nie pamiętam o co dokładnie chodziło (i.e. gdzie surrogate pairs nie były rozumiane, a teraz są).
Wszędzie poza systemem plików, dla którego nazwy to sekwencje bajtów, można UTF-8 dać, a NTFS się nie zorientuje, tylko potem przy próbie odczytu API systemu mogą stwierdzić "NEIN!" ;)

Offline Xender

  • Użytkownik

# Kwiecień 02, 2013, 20:53:41
@up - Jak dokładnie jest z tym NTFSem? Bo chyba coś kojarzę, że Gynvael pisał, że NTFS w kernelu chodzi właśnie na widecharach, a Ty mówisz, że bajtach - to już się zgubiłem...

Offline Radomiej

  • Użytkownik
    • Blog

# Kwiecień 02, 2013, 23:25:28

[DllImport("kernel32.dll", SetLastError = true)]

        private static extern int SetConsoleOutputCP(int wCodePageID);

//****
   [STAThread]
        public void DrawConsole()
        {
            SafeFileHandle h = CreateFile("CONOUT$", 0x40000000, 2, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);
            if (!h.IsInvalid)
            {
                int i = 0;
                CharInfo[] buf = new CharInfo[sizeX * sizeY];
                SmallRect rect = new SmallRect() { Left = 0, Top = 0, Right = (short)sizeX, Bottom = (short)sizeY };
               
                for (int y = 0; y < sizeY; y++)
                {
                    for (int x = 0; x < sizeX; x++)
                    {
                        buf[i].Attributes = (short)(bufforColorForegroundMap[x, y] + (int)bufforColorBackgroundMap[x, y] * 16);
                        buf[i].Char.UnicodeChar = bufforCharMap[x, y];                       
                        i++;
                    }
                }
                SetConsoleOutputCP(65001);               
                bool b = WriteConsoleOutput(h, buf,
                new Coord() { X = (short)sizeX, Y = (short)sizeY },
                new Coord() { X = 0, Y = 0 },
                ref rect);

            }
        }

Mam coś takiego, teoretycznie powinno hulać jak trzeba ale wszystko pozostaje bez zmian. Nawet wpisując różne wartości w SetConsoleOutputCP nic się nie zmienia. Próby konwersji z UTF8 na inny format też nic nie dają.

Offline Xender

  • Użytkownik

# Kwiecień 03, 2013, 00:27:35

Offline Aithne

  • Użytkownik

  • +1
# Kwiecień 03, 2013, 14:30:24
Jak dokładnie jest z tym NTFSem? Bo chyba coś kojarzę, że Gynvael pisał, że NTFS w kernelu chodzi właśnie na widecharach, a Ty mówisz, że bajtach - to już się zgubiłem...
Na jednym i drugim jednocześnie. Dla systemu plików to są bajty, ale muszą występować parami, bo inaczej poczułyby się samotne ;)

Offline Radomiej

  • Użytkownik
    • Blog

# Kwiecień 03, 2013, 18:09:33
Może cziocnka? Genialnie zrobione :D - http://support.microsoft.com/default.aspx?scid=kb;en-us;Q99795.
To możliwe ale nie chce mi się bawić w zmienianie czcionki. Zwłaszcza że ta opcja dostępna jest dopiero od Visty. Dobra to zrobię najwyżej własny konwenter i powinno być ok.

Offline Xender

  • Użytkownik

# Kwiecień 04, 2013, 01:44:14
@up - "For Windows NT, Windows 2000, and Windows XP the currently available Unicode console font is the Lucida Console TrueType font. "