--- a/Stream.st Sun Jan 29 11:04:01 2017 +0000
+++ b/Stream.st Wed Feb 01 11:28:48 2017 +0000
@@ -2525,45 +2525,91 @@
codePoint := aCharacter codePoint.
codePoint <= 16r7F ifTrue:[
+ "/ 7 bits - 1 byte
self nextPut:aCharacter.
^ self.
].
-
- b1 := Character codePoint:((codePoint bitAnd:16r3F) bitOr:2r10000000).
- v := codePoint bitShift:-6.
- v <= 16r1F ifTrue:[
- self nextPut:(Character value:(v bitOr:2r11000000)).
- self nextPut:b1.
+ codePoint <= 16r7FF ifTrue:[
+ "/ 11 bits - 2 byte sequence 5+6
+ self
+ nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r1F) bitOr:16rC0));
+ nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)).
+ ^ self.
+ ].
+ codePoint <= 16rFFFF ifTrue:[
+ "/ 16 bits - 3 byte sequence 4+6+6
+ self
+ nextPut:(Character value:(((codePoint bitShift:-12) bitAnd:16r0F) bitOr:16rE0));
+ nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80));
+ nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)).
^ self.
].
- b2 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
- v := v bitShift:-6.
- v <= 16r0F ifTrue:[
- self nextPut:(Character value:(v bitOr:2r11100000)).
- self nextPut:b2; nextPut:b1.
+ codePoint <= 16r1FFFFF ifTrue:[
+ "/ 21 bits - 4 byte sequence 3+6+6+6
+ self
+ nextPut:(Character value:(((codePoint bitShift:-18) bitAnd:16r07) bitOr:16rF0));
+ nextPut:(Character value:(((codePoint bitShift:-12) bitAnd:16r3F) bitOr:16r80));
+ nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80));
+ nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)).
+ ^ self.
+ ].
+ codePoint <= 16r1FFFFF ifTrue:[
+ "/ 26 bits - 5 byte sequence 2+6+6+6+6
+ self
+ nextPut:(Character value:(((codePoint bitShift:-24) bitAnd:16r03) bitOr:16rF8));
+ nextPut:(Character value:(((codePoint bitShift:-18) bitAnd:16r3F) bitOr:16r80));
+ nextPut:(Character value:(((codePoint bitShift:-12) bitAnd:16r3F) bitOr:16r80));
+ nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80));
+ nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)).
^ self.
].
- b3 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
- v := v bitShift:-6.
- v <= 16r07 ifTrue:[
- self nextPut:(Character value:(v bitOr:2r11110000)).
- self nextPut:b3; nextPut:b2; nextPut:b1.
+ codePoint <= 16r3FFFFFF ifTrue:[
+ "/ 31 bits - 6 byte sequence 1+6+6+6+6+6
+ self
+ nextPut:(Character value:(((codePoint bitShift:-30) bitAnd:16r01) bitOr:16rFC));
+ nextPut:(Character value:(((codePoint bitShift:-24) bitAnd:16r3F) bitOr:16r80));
+ nextPut:(Character value:(((codePoint bitShift:-18) bitAnd:16r3F) bitOr:16r80));
+ nextPut:(Character value:(((codePoint bitShift:-12) bitAnd:16r3F) bitOr:16r80));
+ nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80));
+ nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)).
^ self.
].
- b4 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
- v := v bitShift:-6.
- v <= 16r03 ifTrue:[
- self nextPut:(Character value:(v bitOr:2r11111000)).
- self nextPut:b4; nextPut:b3; nextPut:b2; nextPut:b1.
- ^ self.
- ].
- b5 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
- v := v bitShift:-6.
- v <= 16r01 ifTrue:[
- self nextPut:(Character value:(v bitOr:2r11111100)).
- self nextPut:b5; nextPut:b4; nextPut:b3; nextPut:b2; nextPut:b1.
- ^ self.
- ].
+
+"/ b1 := Character codePoint:((codePoint bitAnd:16r3F) bitOr:2r10000000).
+"/ v := codePoint bitShift:-6.
+"/ v <= 16r1F ifTrue:[
+"/ self nextPut:(Character value:(v bitOr:2r11000000)).
+"/ self nextPut:b1.
+"/ ^ self.
+"/ ].
+"/ b2 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
+"/ v := v bitShift:-6.
+"/ v <= 16r0F ifTrue:[
+"/ self nextPut:(Character value:(v bitOr:2r11100000)).
+"/ self nextPut:b2; nextPut:b1.
+"/ ^ self.
+"/ ].
+"/ b3 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
+"/ v := v bitShift:-6.
+"/ v <= 16r07 ifTrue:[
+"/ self nextPut:(Character value:(v bitOr:2r11110000)).
+"/ self nextPut:b3; nextPut:b2; nextPut:b1.
+"/ ^ self.
+"/ ].
+"/ b4 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
+"/ v := v bitShift:-6.
+"/ v <= 16r03 ifTrue:[
+"/ self nextPut:(Character value:(v bitOr:2r11111000)).
+"/ self nextPut:b4; nextPut:b3; nextPut:b2; nextPut:b1.
+"/ ^ self.
+"/ ].
+"/ b5 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000).
+"/ v := v bitShift:-6.
+"/ v <= 16r01 ifTrue:[
+"/ self nextPut:(Character value:(v bitOr:2r11111100)).
+"/ self nextPut:b5; nextPut:b4; nextPut:b3; nextPut:b2; nextPut:b1.
+"/ ^ self.
+"/ ].
EncodingError raiseWith:aCharacter errorString:'codePoint > 31bit in #nextPutUtf8:'.