# HG changeset patch # User ca # Date 1078931369 -3600 # Node ID ba9c6e58797384376d91f0c8dda27386064e0c02 # Parent c0b336aacec640c0a16bdf4fc32dae41adaca015 care for bitsPerCharacter change during encodeString/decodeString. diff -r c0b336aacec6 -r ba9c6e587973 CharacterEncoder.st --- a/CharacterEncoder.st Wed Mar 10 01:12:27 2004 +0100 +++ b/CharacterEncoder.st Wed Mar 10 16:09:29 2004 +0100 @@ -865,26 +865,28 @@ decodeString:anEncodedString "given a string in my encoding, return a unicode-string for it" - |newString| + |newString myCode uniCodePoint bits| newString := String new:(anEncodedString size). - 1 to:anEncodedString size do:[:idx | - |myCode uniCodePoint| + bits := newString bitsPerCharacter. - myCode := (anEncodedString at:idx) codePoint. - uniCodePoint := self decode:myCode. - uniCodePoint > 16rFF ifTrue:[ - uniCodePoint > 16rFFFF ifTrue:[ - newString bitsPerCharacter < 32 ifTrue:[ - newString := Unicode32String fromString:newString. - ] - ] ifFalse:[ - newString bitsPerCharacter < 16 ifTrue:[ - newString := Unicode16String fromString:newString. - ] - ]. - ]. - newString at:idx put:(Character value:uniCodePoint). + 1 to:anEncodedString size do:[:idx | + uniCodePoint := (anEncodedString at:idx) codePoint. + myCode := self decode:uniCodePoint. + myCode > 16rFF ifTrue:[ + myCode > 16rFFFF ifTrue:[ + bits < 32 ifTrue:[ + newString := Unicode32String fromString:newString. + bits := 32. + ] + ] ifFalse:[ + bits < 16 ifTrue:[ + newString := Unicode16String fromString:newString. + bits := 16. + ] + ] + ]. + newString at:idx put:(Character value:myCode). ]. ^ newString @@ -902,13 +904,28 @@ encodeString:aUnicodeString "given a string in unicode, return a string in my encoding for it" - |newString myCode uniCodePoint| + |newString myCode uniCodePoint bits| - newString := self newString:(aUnicodeString size). + newString := String new:(aUnicodeString size). + bits := newString bitsPerCharacter. + 1 to:aUnicodeString size do:[:idx | - uniCodePoint := (aUnicodeString at:idx) codePoint. - myCode := self encode:uniCodePoint. - newString at:idx put:(Character value:myCode). + uniCodePoint := (aUnicodeString at:idx) codePoint. + myCode := self encode:uniCodePoint. + myCode > 16rFF ifTrue:[ + myCode > 16rFFFF ifTrue:[ + bits < 32 ifTrue:[ + newString := Unicode32String fromString:newString. + bits := 32. + ] + ] ifFalse:[ + bits < 16 ifTrue:[ + newString := Unicode16String fromString:newString. + bits := 16. + ] + ] + ]. + newString at:idx put:(Character value:myCode). ]. ^ newString ! ! @@ -1204,7 +1221,7 @@ !CharacterEncoder class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic/CharacterEncoder.st,v 1.65 2004-03-09 01:03:03 cg Exp $' + ^ '$Header: /cvs/stx/stx/libbasic/CharacterEncoder.st,v 1.66 2004-03-10 15:09:29 ca Exp $' ! ! CharacterEncoder initialize!