2523 b1 b2 b3 b4 b5| |
2523 b1 b2 b3 b4 b5| |
2524 |
2524 |
2525 codePoint := aCharacter codePoint. |
2525 codePoint := aCharacter codePoint. |
2526 |
2526 |
2527 codePoint <= 16r7F ifTrue:[ |
2527 codePoint <= 16r7F ifTrue:[ |
|
2528 "/ 7 bits - 1 byte |
2528 self nextPut:aCharacter. |
2529 self nextPut:aCharacter. |
2529 ^ self. |
2530 ^ self. |
2530 ]. |
2531 ]. |
2531 |
2532 codePoint <= 16r7FF ifTrue:[ |
2532 b1 := Character codePoint:((codePoint bitAnd:16r3F) bitOr:2r10000000). |
2533 "/ 11 bits - 2 byte sequence 5+6 |
2533 v := codePoint bitShift:-6. |
2534 self |
2534 v <= 16r1F ifTrue:[ |
2535 nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r1F) bitOr:16rC0)); |
2535 self nextPut:(Character value:(v bitOr:2r11000000)). |
2536 nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)). |
2536 self nextPut:b1. |
|
2537 ^ self. |
2537 ^ self. |
2538 ]. |
2538 ]. |
2539 b2 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000). |
2539 codePoint <= 16rFFFF ifTrue:[ |
2540 v := v bitShift:-6. |
2540 "/ 16 bits - 3 byte sequence 4+6+6 |
2541 v <= 16r0F ifTrue:[ |
2541 self |
2542 self nextPut:(Character value:(v bitOr:2r11100000)). |
2542 nextPut:(Character value:(((codePoint bitShift:-12) bitAnd:16r0F) bitOr:16rE0)); |
2543 self nextPut:b2; nextPut:b1. |
2543 nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80)); |
|
2544 nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)). |
2544 ^ self. |
2545 ^ self. |
2545 ]. |
2546 ]. |
2546 b3 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000). |
2547 codePoint <= 16r1FFFFF ifTrue:[ |
2547 v := v bitShift:-6. |
2548 "/ 21 bits - 4 byte sequence 3+6+6+6 |
2548 v <= 16r07 ifTrue:[ |
2549 self |
2549 self nextPut:(Character value:(v bitOr:2r11110000)). |
2550 nextPut:(Character value:(((codePoint bitShift:-18) bitAnd:16r07) bitOr:16rF0)); |
2550 self nextPut:b3; nextPut:b2; nextPut:b1. |
2551 nextPut:(Character value:(((codePoint bitShift:-12) bitAnd:16r3F) bitOr:16r80)); |
|
2552 nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80)); |
|
2553 nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)). |
2551 ^ self. |
2554 ^ self. |
2552 ]. |
2555 ]. |
2553 b4 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000). |
2556 codePoint <= 16r1FFFFF ifTrue:[ |
2554 v := v bitShift:-6. |
2557 "/ 26 bits - 5 byte sequence 2+6+6+6+6 |
2555 v <= 16r03 ifTrue:[ |
2558 self |
2556 self nextPut:(Character value:(v bitOr:2r11111000)). |
2559 nextPut:(Character value:(((codePoint bitShift:-24) bitAnd:16r03) bitOr:16rF8)); |
2557 self nextPut:b4; nextPut:b3; nextPut:b2; nextPut:b1. |
2560 nextPut:(Character value:(((codePoint bitShift:-18) bitAnd:16r3F) bitOr:16r80)); |
|
2561 nextPut:(Character value:(((codePoint bitShift:-12) bitAnd:16r3F) bitOr:16r80)); |
|
2562 nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80)); |
|
2563 nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)). |
2558 ^ self. |
2564 ^ self. |
2559 ]. |
2565 ]. |
2560 b5 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000). |
2566 codePoint <= 16r3FFFFFF ifTrue:[ |
2561 v := v bitShift:-6. |
2567 "/ 31 bits - 6 byte sequence 1+6+6+6+6+6 |
2562 v <= 16r01 ifTrue:[ |
2568 self |
2563 self nextPut:(Character value:(v bitOr:2r11111100)). |
2569 nextPut:(Character value:(((codePoint bitShift:-30) bitAnd:16r01) bitOr:16rFC)); |
2564 self nextPut:b5; nextPut:b4; nextPut:b3; nextPut:b2; nextPut:b1. |
2570 nextPut:(Character value:(((codePoint bitShift:-24) bitAnd:16r3F) bitOr:16r80)); |
|
2571 nextPut:(Character value:(((codePoint bitShift:-18) bitAnd:16r3F) bitOr:16r80)); |
|
2572 nextPut:(Character value:(((codePoint bitShift:-12) bitAnd:16r3F) bitOr:16r80)); |
|
2573 nextPut:(Character value:(((codePoint bitShift:-6) bitAnd:16r3F) bitOr:16r80)); |
|
2574 nextPut:(Character value:((codePoint bitAnd:16r3F) bitOr:16r80)). |
2565 ^ self. |
2575 ^ self. |
2566 ]. |
2576 ]. |
|
2577 |
|
2578 "/ b1 := Character codePoint:((codePoint bitAnd:16r3F) bitOr:2r10000000). |
|
2579 "/ v := codePoint bitShift:-6. |
|
2580 "/ v <= 16r1F ifTrue:[ |
|
2581 "/ self nextPut:(Character value:(v bitOr:2r11000000)). |
|
2582 "/ self nextPut:b1. |
|
2583 "/ ^ self. |
|
2584 "/ ]. |
|
2585 "/ b2 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000). |
|
2586 "/ v := v bitShift:-6. |
|
2587 "/ v <= 16r0F ifTrue:[ |
|
2588 "/ self nextPut:(Character value:(v bitOr:2r11100000)). |
|
2589 "/ self nextPut:b2; nextPut:b1. |
|
2590 "/ ^ self. |
|
2591 "/ ]. |
|
2592 "/ b3 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000). |
|
2593 "/ v := v bitShift:-6. |
|
2594 "/ v <= 16r07 ifTrue:[ |
|
2595 "/ self nextPut:(Character value:(v bitOr:2r11110000)). |
|
2596 "/ self nextPut:b3; nextPut:b2; nextPut:b1. |
|
2597 "/ ^ self. |
|
2598 "/ ]. |
|
2599 "/ b4 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000). |
|
2600 "/ v := v bitShift:-6. |
|
2601 "/ v <= 16r03 ifTrue:[ |
|
2602 "/ self nextPut:(Character value:(v bitOr:2r11111000)). |
|
2603 "/ self nextPut:b4; nextPut:b3; nextPut:b2; nextPut:b1. |
|
2604 "/ ^ self. |
|
2605 "/ ]. |
|
2606 "/ b5 := Character codePoint:((v bitAnd:16r3F) bitOr:2r10000000). |
|
2607 "/ v := v bitShift:-6. |
|
2608 "/ v <= 16r01 ifTrue:[ |
|
2609 "/ self nextPut:(Character value:(v bitOr:2r11111100)). |
|
2610 "/ self nextPut:b5; nextPut:b4; nextPut:b3; nextPut:b2; nextPut:b1. |
|
2611 "/ ^ self. |
|
2612 "/ ]. |
2567 |
2613 |
2568 EncodingError raiseWith:aCharacter errorString:'codePoint > 31bit in #nextPutUtf8:'. |
2614 EncodingError raiseWith:aCharacter errorString:'codePoint > 31bit in #nextPutUtf8:'. |
2569 |
2615 |
2570 " |
2616 " |
2571 (String streamContents:[:s| |
2617 (String streamContents:[:s| |