Ignore:
Timestamp:
Jan 13, 2009, 2:01:38 AM (15 years ago)
Author:
イグトランス (egtra)
Message:

#231に関連して、エンコーディング周りを見直し、Encoder/Decoderをストリーム用に特化。
UTF8Encodingをコンパイル可能にし、ビルドに含めるようにした。ただし、実装が不完全なためテストは不可。
(#231)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/ablib/src/Classes/System/IO/StreamReader.ab

    r666 r676  
    11'Classes/System/IO/StreamReader.ab
     2
     3'ToDo: コンソールで入力待ちになる問題への対処
    24
    35Namespace System
     
    3840    End Function
    3941
    40 
    4142Protected
    4243    /*
     
    5859    */
    5960    Override Function Underflow() As Boolean
    60         Dim wcBuf[4095] As WCHAR
    61         Dim mbBuf[4095] As SByte
    62         Dim pNext = mbBuf As PSTR
    63         Dim mbBufSize = Len(buf)
    64         If leadByte <> 0 Then
    65             pNext[0] = leadByte
    66             leadByte = 0
    67             pNext++
    68             mbBufSize--
    69         End If
    70         Dim mbLen = s.Read(pNext As *Byte, 0, mbBufSize)
    71         If mbLen = 0 Then
    72             Underflow = False
    73             Exit Function
    74         End If
    75         Do
    76             Dim q = CharNextExA(cp, pNext, 0)
    77             If q = pNext Then
    78                 Exit Do
    79             End If
    80             pNext = q As PSTR
    81         Loop
    82         If pNext <> mbBuf + mbLen Then
    83             leadByte = mbBuf[mbLen - 1]
    84         End If
    85         Dim wcLen = MultiByteToWideChar(cp, 0, mbBuf, (pNext - mbBuf) As Long, wcBuf, 4095)
    86         Dim s = New String(wcBuf, wcLen)
    8761        Dim buf = Buffer
     62        Dim tmp = New Collections.Generic.List<WCHAR>
     63        Underflow = decoder.Decode(tmp, s)
     64        'ToDo: 非UNICODEのとき、
     65        ' サロゲートペアや結合文字列 (Combining Character Sequence)の途中でバッファが途切れている場合に対応する
     66        Dim s = New String(tmp.Data, tmp.Count)
    8867        buf.Append(s)
    89         Underflow = True
    9068    End Function
    9169Private
     
    9775    Sub init(str As Stream)
    9876        s = str
    99         cp  = CP_ACP '暫定。
    100         leadByte = 0
     77        decoder = New Text.Detail.WindowsCodePageDecoder(CP_ACP)
    10178    End Sub
    10279
    10380    s As Stream
    104     cp As Word
    105     leadByte As Byte
     81    decoder As Text.Decoder
    10682End Class
    10783
Note: See TracChangeset for help on using the changeset viewer.