项目作者: zhangsob

项目描述 :
Binary To String(AlphaNumeric Only) for Java, JavaScript
高级语言: Pascal
项目地址: git://github.com/zhangsob/Base62.git
创建时间: 2020-08-26T03:56:57Z
项目社区:https://github.com/zhangsob/Base62

开源协议:MIT License

下载


BASE62 (AN61 : AlphaNumeric61)

BASE64 Encode에는 +/= 기본형 또는 -_= URL형이 있다.
여기서, 항상 특수문자가 문제가 되어, 0~9, A~Z, a~z만으로 이루어진 Base62 (및 AN61 : AlphaNumeric61)을 만들어 보았다.

원리

  • AN61
Unicode값 UTF-8 Byte단위 값의 범위 비고
0x000000~0x00007F 0xxx xxxx 0x00~0x7F ASCII
0x000080~0x0007FF 110x xxxx 10xx xxxx 0xC0~0xDF, 0x80~0xBF 유럽
0x000800~0x00FFFF 1110 xxxx 10xx xxxx 10xx xxxx 0xE0~0xEF, 0x80~0xBF 한글등
0x010000~0x10FFFF 1111 0zzz 10zz xxxx 10xx xxxx 10xx xxxx 0xF0~0xF7, 0x80~0xBF

여기서, 0x0000 ~ 0xFFFF까지 UCS2에 거의 세계의 주요 문자가 속한다.
(실제로, java나 C#에서 String.length(), String.Length은 문자의 수가 아닌 UTF-16의 길이이다.)

그래서, 0x00~0x7F, 0x80~0xBF, 0xC0~0xDF, 0xE0~0xEF 즉, 0x00~0xEF(240가지)만 주로 사용된다.
2403 < 614 ( 13,824,000 < 13,845,841 ) 이다. (즉, 240가지 3덩어리를 61가지 4덩어리로 표현가능하다.)

BASE64 Encode의 원리도
2563 = 644 즉, 2(83) = 2(64) 로 3Byte을 6bit씩 4덩어리로 표현한 것이다.

  • Base62

여기서, 62가지중 ‘z’를 escape(0xFX영역)하여 Binary도 지원한다.
Base62 [ Binary To String Encoding / Decoding(String To Binary) ]에서는 아래와 같이 한다.

3 Byte Value
xxxx xxxx yyyy yyyy 1111 zzzz 001 xxxx xxxx yyyy yyyy zzzz
xxxx xxxx 1111 yyyy zzzz zzzz 010 xxxx xxxx yyyy zzzz zzzz
xxxx xxxx 1111 yyyy 1111 zzzz 011 0000 xxxx xxxx yyyy zzzz
1111 xxxx yyyy yyyy zzzz zzzz 100 xxxx yyyy yyyy zzzz zzzz
1111 xxxx yyyy yyyy 1111 zzzz 101 0000 xxxx yyyy yyyy zzzz
1111 xxxx 1111 yyyy zzzz zzzz 110 0000 xxxx yyyy zzzz zzzz
1111 xxxx 1111 yyyy 1111 zzzz 111 0000 0000 xxxx yyyy zzzz

3Byte중 0xF0 ~ 0xFF ( 0xFX )에 해당 Byte을 위와 같이 Value를 전환하여 보면, 23bit로 표현이 가능하다.
상위 3bit는 0xFX의 위치를 표시하며, 하위 20bit가 나머지 값이다.

223 < 2403 < 614 ( 8,388,608 < 13,824,000 < 13,845,841 ) 이므로 표현이 가능하다.

2 Byte Value
xxxx xxxx 1111 yyyy 01 xxxx xxxx yyyy
1111 xxxx yyyy yyyy 10 xxxx yyyy yyyy
1111 xxxx 1111 yyyy 11 0000 xxxx yyyy

214 < 2402 < 613 ( 16,384 < 57,600 < 226,981 ) 이므로 표현이 가능하다.

1 Byte Value
1111 xxxx 1 xxxx

25 < 2401 < 612 ( 32 < 240 < 3,721 ) 이므로 표현이 가능하다.

Encoding

Base62 : Binary to AlphaNumeric Only String Encoding
AN61 : UCS2 String to AlphaNumeric Only String Encoding
AN62 : All Unicode String to AlphaNumeric Only String Encoding - https://github.com/zhangsob/AN62 참조

장단점

단점 : BASE64는 bit연산으로 구현하고, Base62(AN61)는 산술연산으로 다소 속도는 느림

장점 : 특수문자(기호)가 없어 어떠한 환경에서 값으로 사용할 수 있음.

지원언어

아래 언어로 소스코드를 올립니다.

Java BASE62 예

  1. public static void main(String[] args) {
  2. try {
  3. byte[] bin = new byte[256] ;
  4. for(int i = 0; i < bin.length; ++i)
  5. bin[i] = (byte)i ;
  6. System.out.println("----bin["+bin.length+"]----") ;
  7. System.out.println(Base62.bin2hexa(bin)) ;
  8. String txt = Base62.encode(bin) ;
  9. System.out.println("txt["+txt.length()+"]:" + txt) ;
  10. byte[] out = Base62.decode(txt) ;
  11. System.out.println("----out["+out.length+"]----") ;
  12. System.out.println(Base62.bin2hexa(out)) ;
  13. } catch(Exception e) {
  14. e.printStackTrace();
  15. }
  16. }

  1. ----bin[256]----
  2. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  3. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  4. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  5. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  6. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  7. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  8. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  9. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  10. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  11. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  12. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  13. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  14. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  15. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  16. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  17. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
  18. txt[348]:003x0kgb1WKF2Hws33aW3oEA4Zqn5LUR67856rki7dOM8P209Aed9vIHAguuBSYYCECCCyopDkSTEW67FHikG3MOGo02HZcfILGJJ6swJrWaKdAELOmrMAQVMv49NggmOSKQPDx4PyahQkELRVqySHUcT38GTnktUZOXVL2BW6eoWrISXcv6YOYjZACNZup1agSebS6IcDivcyMZdk0DeVcqfHGUg2t8gnWlhZAPiKn3j6Qgjr4KkcgxlOKbm9xFmuasngEWoRrApDUnpy8Rqjl5rVOisH2Mt2f0tnIduYvHvKYuw6CYwqpCxcSpyO6TzWKagzWKo7zWL2XzWLFxzWLTOz0V
  19. ----out[256]----
  20. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  21. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  22. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  23. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  24. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  25. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  26. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  27. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  28. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  29. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  30. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  31. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  32. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  33. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  34. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  35. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

Java AN61 예

  1. public static void main(String[] args) {
  2. try {
  3. String src0 = "http://test.com:8080/an61.do?name=가나다 ㄱㄴ※\n可" ;
  4. System.out.println("src0["+src0.length()+"]:" + src0) ;
  5. String an61__tmp0 = AN61.encode(src0) ;
  6. System.out.println("an61__tmp0["+an61__tmp0.length()+"]:" + an61__tmp0) ;
  7. String an61__out0 = AN61.decode(an61__tmp0) ;
  8. System.out.println("an61__out0["+an61__out0.length()+"]:" + an61__out0) ;
  9. System.out.println("src0.equals(an61__out0) : " + src0.equals(an61__out0)) ;
  10. String base64_tmp = java.util.Base64.getEncoder().encodeToString(src0.getBytes("utf8")) ;
  11. System.out.println("base64_tmp["+base64_tmp.length()+"]:" + base64_tmp) ;
  12. String base64_out = new String(java.util.Base64.getDecoder().decode(base64_tmp), "utf8") ;
  13. System.out.println("base64_out["+base64_out.length()+"]:" + base64_out) ;
  14. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  15. String src1 = "http://test.com:8080/an61.do?name=가나다 ㄱㄴ※\n可🐘" ; // UnsupportedEncodingException이 발생하는 경우
  16. System.out.println("src1["+src1.length()+"]:" + src1) ; // String.length()은 문자갯수가 아니라, UTF16의 길이다.
  17. try {
  18. String tmp1 = AN61.encode(src1) ;
  19. System.out.println("tmp1:" + tmp1) ;
  20. String out1 = AN61.decode(tmp1) ;
  21. System.out.println("out1:" + out1) ;
  22. } catch(UnsupportedEncodingException uee) {
  23. System.err.println(uee) ;
  24. String tmp2 = Base62.encode(src1.getBytes("utf8")) ;
  25. System.out.println("tmp2["+tmp2.length()+"]:" + tmp2) ;
  26. String out2 = new String(Base62.decode(tmp2), "utf8") ;
  27. System.out.println("out2["+out2.length()+"]:" + out2) ;
  28. System.out.println("src1.equals(out2) : " + src1.equals(out2)) ;
  29. }
  30. } catch(Exception e) {
  31. e.printStackTrace();
  32. }
  33. }

  1. src0[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  2. an61__tmp0[76]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  3. an61__out0[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  4. src0.equals(an61__out0) : true
  5. base64_tmp[76]:aHR0cDovL3Rlc3QuY29tOjgwODAvYW42MS5kbz9uYW1lPeqwgOuCmOuLpCDjhLHjhLTigLsK5Y+v
  6. base64_out[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  7. src1[45]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  8. 可🐘
  9. java.io.UnsupportedEncodingException: invalid UCS2 character index 43 🐘
  10. tmp2[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  11. out2[45]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  12. 可🐘
  13. src1.equals(out2) : true

JavaScript BASE62 예

  1. try {
  2. var bin = [], i = 0 ;
  3. for(i = 0;i < 256; ++i)
  4. bin[i] = i ;
  5. print('----bin['+bin.length+']----') ;
  6. print(Base62.bin2hexa(bin)) ;
  7. var txt = Base62.encode(bin) ;
  8. print('txt['+txt.length+']:' + txt) ;
  9. var out = Base62.decode(txt) ;
  10. print('----out['+out.length+']----') ;
  11. print(Base62.bin2hexa(out)) ;
  12. } catch(e) {
  13. print(e) ;
  14. }

  1. ----bin[256]----
  2. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  3. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  4. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  5. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  6. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  7. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  8. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  9. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  10. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  11. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  12. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  13. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  14. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  15. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  16. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  17. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
  18. txt[348]:003x0kgb1WKF2Hws33aW3oEA4Zqn5LUR67856rki7dOM8P209Aed9vIHAguuBSYYCECCCyopDkSTEW67FHikG3MOGo02HZcfILGJJ6swJrWaKdAELOmrMAQVMv49NggmOSKQPDx4PyahQkELRVqySHUcT38GTnktUZOXVL2BW6eoWrISXcv6YOYjZACNZup1agSebS6IcDivcyMZdk0DeVcqfHGUg2t8gnWlhZAPiKn3j6Qgjr4KkcgxlOKbm9xFmuasngEWoRrApDUnpy8Rqjl5rVOisH2Mt2f0tnIduYvHvKYuw6CYwqpCxcSpyO6TzWKagzWKo7zWL2XzWLFxzWLTOz0V
  19. ----out[256]----
  20. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  21. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  22. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  23. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  24. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  25. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  26. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  27. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  28. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  29. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  30. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  31. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  32. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  33. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  34. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  35. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

JavaScript AN61 예

  1. try {
  2. var src0 = "http://test.com:8080/an61.do?name=가나다 ㄱㄴ※\n可" ;
  3. print('src0['+src0.length+']:' + src0) ;
  4. var tmp0 = AN61.encode(src0) ;
  5. print('tmp0['+tmp0.length+']:' + tmp0) ;
  6. var out0 = AN61.decode(tmp0) ;
  7. print('out0['+out0.length+']:' + out0) ;
  8. print('src0 === out0 : ' + (src0 === out0)) ;
  9. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  10. var src1 = "http://test.com:8080/an61.do?name=가나다 ㄱㄴ※\n可🐘" ; // Exception이 발생하는 경우
  11. print('src1['+src1.length+']:' + src1) ;
  12. try {
  13. var tmp1 = AN61.encode(src1) ;
  14. print("tmp1:" + tmp1) ;
  15. var out1 = AN61.decode(tmp1) ;
  16. print("out1:" + out1) ;
  17. }
  18. catch(e) {
  19. console.error(e) ;
  20. console.log('typeof Base62 : ' + (typeof Base62)) ;
  21. if(typeof Base62 === 'object') {
  22. var tmp2 = Base62.encode(AN61.toUTF8(src1)) ;
  23. print('tmp2['+tmp2.length+']:' + tmp2) ;
  24. var out2 = AN61.fromUTF8(Base62.decode(tmp2)) ;
  25. print('out2['+out2.length+']:' + out2) ;
  26. print('src1 === out2 : ' + (src1 === out2)) ;
  27. }
  28. }
  29. } catch(e) {
  30. print(e) ;
  31. }

  1. src0[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  2. tmp0[76]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  3. out0[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  4. src0 === out0 : true
  5. src1[45]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  6. 可🐘
  7. invalid UCS2 character index 43 🐘
  8. typeof Base62 : object
  9. tmp2[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  10. out2[45]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  11. 可🐘
  12. src1 === out2 : true

Python BASE62 예

  1. if __name__ == '__main__':
  2. bin = bytearray(256) ;
  3. for i in range(len(bin)) :
  4. bin[i] = i
  5. print('----bin['+str(len(bin))+']----')
  6. print(Base62.bin2hexa(bin))
  7. txt = Base62.encode(bin)
  8. print('txt['+str(len(txt))+']:'+txt)
  9. out = Base62.decode(txt)
  10. print('----out['+str(len(out))+']----')
  11. print(Base62.bin2hexa(out))

  1. ----bin[256]----
  2. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  3. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  4. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  5. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  6. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  7. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  8. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  9. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  10. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  11. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  12. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  13. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  14. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  15. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  16. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  17. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
  18. txt[348]:003x0kgb1WKF2Hws33aW3oEA4Zqn5LUR67856rki7dOM8P209Aed9vIHAguuBSYYCECCCyopDkSTEW67FHikG3MOGo02HZcfILGJJ6swJrWaKdAELOmrMAQVMv49NggmOSKQPDx4PyahQkELRVqySHUcT38GTnktUZOXVL2BW6eoWrISXcv6YOYjZACNZup1agSebS6IcDivcyMZdk0DeVcqfHGUg2t8gnWlhZAPiKn3j6Qgjr4KkcgxlOKbm9xFmuasngEWoRrApDUnpy8Rqjl5rVOisH2Mt2f0tnIduYvHvKYuw6CYwqpCxcSpyO6TzWKagzWKo7zWL2XzWLFxzWLTOz0V
  19. ----out[256]----
  20. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  21. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  22. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  23. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  24. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  25. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  26. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  27. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  28. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  29. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  30. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  31. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  32. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  33. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  34. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  35. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

Python AN61 예

  1. if __name__ == '__main__':
  2. src0 = 'http://test.com:8080/an61.do?name=가나다 ㄱㄴ※\n可'
  3. print('src0['+str(len(src0))+']:' + src0)
  4. an61__tmp0 = AN61.encode(src0)
  5. print('an61__tmp0['+str(len(an61__tmp0))+']:' + an61__tmp0)
  6. an61__out0 = AN61.decode(an61__tmp0)
  7. print('an61__out0['+str(len(an61__out0))+']:' + an61__out0)
  8. print('src0 == an61__out0 :', (src0 == an61__out0))
  9. base64_tmp = base64.b64encode(src0.encode('utf8')).decode('utf8')
  10. print('base64_tmp['+str(len(base64_tmp))+']:' + base64_tmp)
  11. base64_out = base64.b64decode(base64_tmp.encode('utf8')).decode('utf8')
  12. print('base64_out['+str(len(base64_out))+']:' + base64_out)
  13. # [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  14. src1 = "http://test.com:8080/an61.do?name=가나다 ㄱㄴ※\n可🐘" # ValueError가 발생하는 경우
  15. print('src1['+str(len(src1))+']:' + src1)
  16. try :
  17. tmp1 = AN61.encode(src1)
  18. print('tmp1:' + tmp1)
  19. out1 = AN61.decode(tmp1)
  20. print('out1:' + out1)
  21. except ValueError as ve :
  22. print('Error : ' + str(ve))
  23. tmp2 = Base62.encode(src1.encode("utf8"))
  24. print('tmp2['+str(len(tmp2))+']:' + tmp2)
  25. out2 = Base62.decode(tmp2).decode("utf8")
  26. print('out2['+str(len(out2))+']:' + out2)
  27. print('src1 == out2 :', (src1 == out2))

  1. src0[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  2. an61__tmp0[76]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  3. an61__out0[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  4. src0 == an61__out0 : True
  5. base64_tmp[76]:aHR0cDovL3Rlc3QuY29tOjgwODAvYW42MS5kbz9uYW1lPeqwgOuCmOuLpCDjhLHjhLTigLsK5Y+v
  6. base64_out[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  7. src1[44]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  8. 可�🐘
  9. Error : Illegal base62 character index 43 �🐘
  10. tmp2[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  11. out2[44]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  12. 可�🐘
  13. src1 == out2 : True

C# BASE62 예

  1. static void Main(string[] args)
  2. {
  3. byte[] bin = new byte[256];
  4. for (int i = 0, len = bin.Length; i < len; ++i)
  5. bin[i] = (byte)i;
  6. Console.WriteLine("----bin[" + bin.Length + "]----");
  7. Console.WriteLine(Base62.bin2hexa(bin));
  8. string txt = Base62.encode(bin);
  9. Console.WriteLine("txt[" + txt.Length + "]:" + txt);
  10. byte[] dst = Base62.decode(txt);
  11. Console.WriteLine("----dst[" + dst.Length + "]----");
  12. Console.WriteLine(Base62.bin2hexa(dst));
  13. }

  1. ----bin[256]----
  2. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  3. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  4. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  5. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  6. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  7. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  8. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  9. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  10. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  11. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  12. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  13. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  14. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  15. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  16. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  17. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
  18. txt[348]:003x0kgb1WKF2Hws33aW3oEA4Zqn5LUR67856rki7dOM8P209Aed9vIHAguuBSYYCECCCyopDkSTEW67FHikG3MOGo02HZcfILGJJ6swJrWaKdAELOmrMAQVMv49NggmOSKQPDx4PyahQkELRVqySHUcT38GTnktUZOXVL2BW6eoWrISXcv6YOYjZACNZup1agSebS6IcDivcyMZdk0DeVcqfHGUg2t8gnWlhZAPiKn3j6Qgjr4KkcgxlOKbm9xFmuasngEWoRrApDUnpy8Rqjl5rVOisH2Mt2f0tnIduYvHvKYuw6CYwqpCxcSpyO6TzWKagzWKo7zWL2XzWLFxzWLTOz0V
  19. ----dst[256]----
  20. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  21. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  22. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  23. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  24. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  25. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  26. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  27. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  28. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  29. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  30. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  31. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  32. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  33. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  34. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  35. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

C# AN61 예

  1. static void Main(string[] args)
  2. {
  3. string src0 = "http://test.com:8080/an61.do?name=가나다 ㄱㄴ※\n可";
  4. Console.WriteLine("src0[" + src0.Length + "]:" + src0);
  5. string an61__tmp0 = AN61.encode(src0);
  6. Console.WriteLine("an61__tmp0[" + an61__tmp0.Length + "]:" + an61__tmp0);
  7. string an61__out0 = AN61.decode(an61__tmp0);
  8. Console.WriteLine("an61__out0[" + an61__out0.Length + "]:" + an61__out0);
  9. Console.WriteLine("(src0 == an61__out0) : " + (src0 == an61__out0));
  10. string base64_tmp = Convert.ToBase64String(Encoding.UTF8.GetBytes(src0));
  11. Console.WriteLine("base64_tmp[" + base64_tmp.Length + "]:" + base64_tmp);
  12. string base64_out = Encoding.UTF8.GetString(Convert.FromBase64String(base64_tmp));
  13. Console.WriteLine("base64_out[" + base64_out.Length + "]:" + base64_out);
  14. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  15. string src1 = "http://test.com:8080/an61.do?name=가나다 ㄱㄴ※\n可🐘"; // ArgumentException이 발생하는 경우
  16. Console.WriteLine("src1[" + src1.Length + "]:" + src1);
  17. try
  18. {
  19. string tmp1 = AN61.encode(src1);
  20. Console.WriteLine("tmp1:" + tmp1);
  21. string out1 = AN61.decode(tmp1);
  22. Console.WriteLine("out1:" + out1);
  23. }
  24. catch (ArgumentException ae)
  25. {
  26. Console.Error.WriteLine("Error : " + ae.Message);
  27. string tmp2 = Base62.encode(Encoding.UTF8.GetBytes(src1));
  28. Console.WriteLine("tmp2[" + tmp2.Length + "]:" + tmp2);
  29. string out2 = Encoding.UTF8.GetString(Base62.decode(tmp2));
  30. Console.WriteLine("out2[" + out2.Length + "]:" + out2);
  31. Console.WriteLine("(src1 == out2) : " + (src1 == out2));
  32. }
  33. }

  1. src0[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  2. an61__tmp0[76]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  3. an61__out0[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  4. (src0 == an61__out0) : True
  5. base64_tmp[76]:aHR0cDovL3Rlc3QuY29tOjgwODAvYW42MS5kbz9uYW1lPeqwgOuCmOuLpCDjhLHjhLTigLsK5Y+v
  6. base64_out[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  7. src1[45]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  8. 可??
  9. Error : invalid UCS2 character index 43 ??
  10. tmp2[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  11. out2[45]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  12. 可??
  13. (src1 == out2) : True

CPP BASE62 예

  1. // charset : ASCII
  2. #include "base62.h"
  3. #include <stdio.h>
  4. std::string bin2hexa(const std::vector<unsigned char>& bin)
  5. {
  6. std::string ret ;
  7. char tmp[4] ;
  8. for (size_t i = 0, len = bin.size(); i < len; ++i) {
  9. sprintf(tmp, "%02X ", bin[i] & 0xFF) ;
  10. ret.append(tmp) ;
  11. if(i % 16 == 7) ret.push_back(' ') ;
  12. else if(i % 16 == 15) ret.push_back('\n') ;
  13. }
  14. if(bin.size() % 16 != 0) ret.push_back('\n') ;
  15. return ret ;
  16. }
  17. int main(int argc, char *argv[])
  18. {
  19. std::vector<unsigned char> bin ;
  20. bin.resize(256) ;
  21. for(size_t i = 0, len = bin.size(); i < len; ++i)
  22. bin[i] = (unsigned char)i ;
  23. printf("----bin[%zu]----\n", bin.size()) ;
  24. printf("%s\n", bin2hexa(bin).c_str()) ;
  25. std::string txt = Base62::encode(bin) ;
  26. printf("txt[%zu]:%s\n", txt.size(), txt.c_str()) ;
  27. std::vector<unsigned char> out = Base62::decode(txt) ;
  28. printf("----out[%zu]----\n", out.size()) ;
  29. printf("%s\n", bin2hexa(out).c_str()) ;
  30. return 0 ;
  31. }

  1. ----bin[256]----
  2. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  3. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  4. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  5. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  6. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  7. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  8. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  9. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  10. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  11. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  12. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  13. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  14. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  15. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  16. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  17. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
  18. txt[348]:003x0kgb1WKF2Hws33aW3oEA4Zqn5LUR67856rki7dOM8P209Aed9vIHAguuBSYYCECCCyopDkSTEW67FHikG3MOGo02HZcfILGJJ6swJrWaKdAELOmrMAQVMv49NggmOSKQPDx4PyahQkELRVqySHUcT38GTnktUZOXVL2BW6eoWrISXcv6YOYjZACNZup1agSebS6IcDivcyMZdk0DeVcqfHGUg2t8gnWlhZAPiKn3j6Qgjr4KkcgxlOKbm9xFmuasngEWoRrApDUnpy8Rqjl5rVOisH2Mt2f0tnIduYvHvKYuw6CYwqpCxcSpyO6TzWKagzWKo7zWL2XzWLFxzWLTOz0V
  19. ----out[256]----
  20. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  21. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  22. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  23. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  24. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  25. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  26. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  27. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  28. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  29. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  30. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  31. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  32. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  33. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  34. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  35. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

CPP AN61 예 (Windows)

  1. // charset : EUC-KR(on Windows)
  2. #include "an61.h"
  3. #include "zstring.h"
  4. #include "base62.h"
  5. #include <stdio.h>
  6. int main(int argc, char *argv[])
  7. {
  8. std::string locale(setlocale(LC_ALL, "")) ;
  9. printf("locale : [%s]\n", locale.c_str()) ;
  10. printf("sizeof(wchar_t) : %zd\n", sizeof(wchar_t)) ;
  11. {
  12. printf("---wstring to wstring---\n") ;
  13. std::wstring src0 = L"http://test.com:8080/an62.do?name=가나다 ㄱㄴ※\n可" ;
  14. printf("src0[%zd]:%s\n", src0.length(), wstring2system(src0).c_str()) ;
  15. std::string tmp0 = AN61::encode(src0) ;
  16. printf("tmp0:%s\n", tmp0.c_str()) ;
  17. std::wstring out0 = AN61::decode(tmp0) ;
  18. printf("out0:%s\n", wstring2system(out0).c_str()) ;
  19. printf("src0.compare(out0) : %d\n", src0.compare(out0)) ;
  20. }
  21. {
  22. if(isSystemUTF8()) printf("---UTF8 to UTF8---\n") ;
  23. else printf("---EUC-KR to EUC-KR---\n") ;
  24. std::string src0 = "http://test.com:8080/an62.do?name=가나다 ㄱㄴ※\n可" ;
  25. printf("src0[%zd]:%s\n", src0.length(), src0.c_str()) ;
  26. std::string tmp0 = AN61::encode(system2wstring(src0)) ;
  27. printf("tmp0:%s\n", tmp0.c_str()) ;
  28. std::string out0 = wstring2system(AN61::decode(tmp0)) ;
  29. printf("out0:%s\n", out0.c_str()) ;
  30. printf("src0.compare(out0) : %d\n", src0.compare(out0)) ;
  31. }
  32. {
  33. printf("---wstring to wstring---\n") ;
  34. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  35. std::wstring src1 = L"http://test.com:8080/an62.do?name=가나다 ㄱㄴ※\n可" ;
  36. if(sizeof(wchar_t) == 2) { // Windows
  37. src1.push_back((wchar_t)0xD83D) ;
  38. src1.push_back((wchar_t)0xDC18) ;
  39. }
  40. else { // Linux
  41. src1.push_back((wchar_t)0x01F418) ;
  42. }
  43. printf("src1[%zd]:%s\n", src1.length(), wstring2system(src1).c_str()) ;
  44. try {
  45. std::string tmp1 = AN61::encode(src1) ;
  46. printf("tmp1:%s\n", tmp1.c_str()) ;
  47. std::wstring out1 = AN61::decode(tmp1) ;
  48. printf("out1:%s\n", wstring2system(out1).c_str()) ;
  49. }
  50. catch(const std::exception& e) {
  51. fprintf(stderr, "Error : %s\n", e.what()) ;
  52. std::string utf8 = wstring2utf8(src1) ;
  53. std::vector<unsigned char> utf8_bin(utf8.cbegin(), utf8.cend()) ;
  54. std::string tmp2 = Base62::encode(utf8_bin) ;
  55. printf("tmp2[%zu]:%s\n", tmp2.size(), tmp2.c_str()) ;
  56. std::vector<unsigned char> out2_bin = Base62::decode(tmp2) ;
  57. std::string utf8_str(out2_bin.cbegin(), out2_bin.cend()) ;
  58. std::wstring out2 = utf8_to_wstring(utf8_str) ;
  59. printf("out2[%zu]:%s\n", out2.size(), wstring2system(out2).c_str()) ;
  60. printf("src1.compare(out2) : %d\n", src1.compare(out2)) ;
  61. }
  62. }
  63. {
  64. printf("---utf8 to utf8---\n") ;
  65. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  66. std::string utf8 = system2utf8("http://test.com:8080/an62.do?name=가나다 ㄱㄴ※\n可") ;
  67. utf8.push_back((char)0xF0) ;
  68. utf8.push_back((char)0x9F) ;
  69. utf8.push_back((char)0x90) ;
  70. utf8.push_back((char)0x98) ;
  71. printf("utf8[%zd]:%s\n", utf8.length(), utf8_to_system(utf8).c_str()) ;
  72. try {
  73. std::string tmp1 = AN61::encode(utf8_to_wstring(utf8)) ;
  74. printf("tmp1:%s\n", tmp1.c_str()) ;
  75. std::string out8 = wstring2utf8(AN61::decode(tmp1)) ;
  76. printf("out8[%zd]:%s\n", out8.length(), utf8_to_system(out8).c_str()) ;
  77. }
  78. catch(const std::exception& e) {
  79. fprintf(stderr, "Error : %s\n", e.what()) ;
  80. std::vector<unsigned char> utf8_bin(utf8.cbegin(), utf8.cend()) ;
  81. std::string tmp8 = Base62::encode(utf8_bin) ;
  82. printf("tmp8[%zu]:%s\n", tmp8.size(), tmp8.c_str()) ;
  83. std::vector<unsigned char> out8_bin = Base62::decode(tmp8) ;
  84. std::string out8(out8_bin.cbegin(), out8_bin.cend()) ;
  85. printf("out8[%zu]:%s\n", utf8.size(), utf8_to_system(utf8).c_str()) ;
  86. printf("utf8.compare(out8) : %d\n", utf8.compare(out8)) ;
  87. }
  88. }
  89. return 0 ;
  90. }

  1. locale : [Korean_Korea.949]
  2. sizeof(wchar_t) : 2
  3. ---wstring to wstring---
  4. src0[43]:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  5. tmp0:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CixjSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  6. out0:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  7. src0.compare(out0) : 0
  8. ---EUC-KR to EUC-KR---
  9. src0[50]:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  10. tmp0:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CixjSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  11. out0:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  12. src0.compare(out0) : 0
  13. ---wstring to wstring---
  14. src1[45]:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  15. 可??
  16. Error : invalid UCS2 character
  17. tmp2[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CixjSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  18. out2[45]:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  19. 可??
  20. src1.compare(out2) : 0
  21. ---utf8 to utf8---
  22. utf8[61]:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  23. 可??
  24. Error : invalid UCS2 character
  25. tmp8[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CixjSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  26. out8[61]:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  27. 可??
  28. utf8.compare(out8) : 0

CPP AN61 예 (Linux)

  1. // charset : UTF-8(on Linux)
  2. #include "an61.h"
  3. #include "zstring.h"
  4. #include "base62.h"
  5. #include <stdio.h>
  6. int main(int argc, char *argv[])
  7. {
  8. std::string locale(setlocale(LC_ALL, "")) ;
  9. printf("locale : [%s]\n", locale.c_str()) ;
  10. printf("sizeof(wchar_t) : %zd\n", sizeof(wchar_t)) ;
  11. {
  12. printf("---wstring to wstring---\n") ;
  13. std::wstring src0 = L"http://test.com:8080/an62.do?name=가나다 ㄱㄴ※\n可" ;
  14. printf("src0[%zd]:%s\n", src0.length(), wstring2system(src0).c_str()) ;
  15. std::string tmp0 = AN61::encode(src0) ;
  16. printf("tmp0:%s\n", tmp0.c_str()) ;
  17. std::wstring out0 = AN61::decode(tmp0) ;
  18. printf("out0:%s\n", wstring2system(out0).c_str()) ;
  19. printf("src0.compare(out0) : %d\n", src0.compare(out0)) ;
  20. }
  21. {
  22. if(isSystemUTF8()) printf("---UTF8 to UTF8---\n") ;
  23. else printf("---EUC-KR to EUC-KR---\n") ;
  24. std::string src0 = "http://test.com:8080/an62.do?name=가나다 ㄱㄴ※\n可" ;
  25. printf("src0[%zd]:%s\n", src0.length(), src0.c_str()) ;
  26. std::string tmp0 = AN61::encode(system2wstring(src0)) ;
  27. printf("tmp0:%s\n", tmp0.c_str()) ;
  28. std::string out0 = wstring2system(AN61::decode(tmp0)) ;
  29. printf("out0:%s\n", out0.c_str()) ;
  30. printf("src0.compare(out0) : %d\n", src0.compare(out0)) ;
  31. }
  32. {
  33. printf("---wstring to wstring---\n") ;
  34. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  35. std::wstring src1 = L"http://test.com:8080/an62.do?name=가나다 ㄱㄴ※\n可🐘" ;
  36. printf("src1[%zd]:%s\n", src1.length(), wstring2system(src1).c_str()) ;
  37. try {
  38. std::string tmp1 = AN61::encode(src1) ;
  39. printf("tmp1:%s\n", tmp1.c_str()) ;
  40. std::wstring out1 = AN61::decode(tmp1) ;
  41. printf("out1:%s\n", wstring2system(out1).c_str()) ;
  42. }
  43. catch(const std::exception& e) {
  44. fprintf(stderr, "Error : %s\n", e.what()) ;
  45. std::string utf8 = wstring2utf8(src1) ;
  46. std::vector<unsigned char> utf8_bin(utf8.cbegin(), utf8.cend()) ;
  47. std::string tmp2 = Base62::encode(utf8_bin) ;
  48. printf("tmp2[%zu]:%s\n", tmp2.size(), tmp2.c_str()) ;
  49. std::vector<unsigned char> out2_bin = Base62::decode(tmp2) ;
  50. std::string utf8_str(out2_bin.cbegin(), out2_bin.cend()) ;
  51. std::wstring out2 = utf8_to_wstring(utf8_str) ;
  52. printf("out2[%zu]:%s\n", out2.size(), wstring2system(out2).c_str()) ;
  53. printf("src1.compare(out2) : %d\n", src1.compare(out2)) ;
  54. }
  55. }
  56. {
  57. printf("---utf8 to utf8---\n") ;
  58. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  59. std::string utf8 = system2utf8("http://test.com:8080/an62.do?name=가나다 ㄱㄴ※\n可🐘") ;
  60. printf("utf8[%zd]:%s\n", utf8.length(), utf8_to_system(utf8).c_str()) ;
  61. try {
  62. std::string tmp1 = AN61::encode(utf8_to_wstring(utf8)) ;
  63. printf("tmp1:%s\n", tmp1.c_str()) ;
  64. std::string out8 = wstring2utf8(AN61::decode(tmp1)) ;
  65. printf("out8[%zd]:%s\n", out8.length(), utf8_to_system(out8).c_str()) ;
  66. }
  67. catch(const std::exception& e) {
  68. fprintf(stderr, "Error : %s\n", e.what()) ;
  69. std::vector<unsigned char> utf8_bin(utf8.cbegin(), utf8.cend()) ;
  70. std::string tmp8 = Base62::encode(utf8_bin) ;
  71. printf("tmp8[%zu]:%s\n", tmp8.size(), tmp8.c_str()) ;
  72. std::vector<unsigned char> out8_bin = Base62::decode(tmp8) ;
  73. std::string out8(out8_bin.cbegin(), out8_bin.cend()) ;
  74. printf("out8[%zu]:%s\n", utf8.size(), utf8_to_system(utf8).c_str()) ;
  75. printf("utf8.compare(out8) : %d\n", utf8.compare(out8)) ;
  76. }
  77. }
  78. return 0 ;
  79. }

  1. locale : [ko_KR.UTF-8]
  2. sizeof(wchar_t) : 4
  3. ---wstring to wstring---
  4. src0[43]:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  5. tmp0:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CixjSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  6. out0:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  7. src0.compare(out0) : 0
  8. ---UTF8 to UTF8---
  9. src0[57]:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  10. tmp0:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CixjSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  11. out0:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  12. src0.compare(out0) : 0
  13. ---wstring to wstring---
  14. src1[44]:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  15. 可🐘
  16. Error : invalid UCS2 character
  17. tmp2[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CixjSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  18. out2[44]:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  19. 可🐘
  20. src1.compare(out2) : 0
  21. ---utf8 to utf8---
  22. utf8[61]:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  23. 可🐘
  24. Error : invalid UCS2 character
  25. tmp8[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CixjSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  26. out8[61]:http://test.com:8080/an62.do?name=가나다 ㄱㄴ※
  27. 可🐘
  28. utf8.compare(out8) : 0

Pascal BASE62 예

  1. program Base62Test;
  2. {$APPTYPE CONSOLE}
  3. uses
  4. SysUtils, Base62;
  5. function bin2hexa(bin : TBytes) : string ;
  6. const
  7. HexaString = '0123456789ABCDEF' ;
  8. var
  9. i : Integer ;
  10. begin
  11. result := '' ;
  12. for i := 0 to Length(bin)-1 do
  13. begin
  14. result := result + HexaString[1 + (bin[i] shr 4)] ;
  15. result := result + HexaString[1 + (bin[i] and 15)] ;
  16. result := result + ' ' ;
  17. if (i mod 16) = 7 then
  18. result := result + ' '
  19. else if (i mod 16) = 15 then
  20. result := result + #10 ;
  21. end ;
  22. end;
  23. var
  24. bin, dst : TBytes ;
  25. txt : string ;
  26. i : Integer ;
  27. begin
  28. SetLength(bin, 256) ;
  29. for i := 0 to Length(bin)-1 do
  30. bin[i] := i ;
  31. WriteLn('---bin[', Length(bin), ']---') ;
  32. WriteLn(bin2hexa(bin)) ;
  33. txt := TBase62.Encode(bin) ;
  34. WriteLn('txt[', Length(txt), ']:', txt) ;
  35. dst := TBase62.Decode(txt) ;
  36. WriteLn('---dst[', Length(dst), ']---') ;
  37. WriteLn(bin2hexa(dst)) ;
  38. ReadLn;
  39. end.

  1. ---bin[256]---
  2. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  3. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  4. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  5. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  6. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  7. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  8. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  9. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  10. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  11. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  12. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  13. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  14. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  15. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  16. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  17. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
  18. txt[348]:003x0kgb1WKF2Hws33aW3oEA4Zqn5LUR67856rki7dOM8P209Aed9vIHAguuBSYYCECCCyopDkSTEW67FHikG3MOGo02HZcfILGJJ6swJrWaKdAELOmrMAQVMv49NggmOSKQPDx4PyahQkELRVqySHUcT38GTnktUZOXVL2BW6eoWrISXcv6YOYjZACNZup1agSebS6IcDivcyMZdk0DeVcqfHGUg2t8gnWlhZAPiKn3j6Qgjr4KkcgxlOKbm9xFmuasngEWoRrApDUnpy8Rqjl5rVOisH2Mt2f0tnIduYvHvKYuw6CYwqpCxcSpyO6TzWKagzWKo7zWL2XzWLFxzWLTOz0V
  19. ---dst[256]---
  20. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  21. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  22. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  23. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  24. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  25. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  26. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  27. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  28. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  29. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  30. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  31. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  32. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  33. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  34. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  35. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

Pascal AN61 예 (Delphi)

  1. { charset : EUC-KR }
  2. program AN61Test;
  3. {$APPTYPE CONSOLE}
  4. uses
  5. SysUtils,
  6. AN61 in 'AN61.pas',
  7. Base62 in 'Base62.pas',
  8. ZString in 'ZString.pas';
  9. var
  10. wsrc, wout : WideString ;
  11. wtmp, tmp0, tmp8 : string ;
  12. src0, out0 : AnsiString ;
  13. utf8, out8 : UTF8String ;
  14. begin
  15. WriteLn('----------AnsiString------------') ;
  16. src0 := 'http://test.com:8080/an61.do?name=가나다 ㄱㄴ※'#10'可' ; // Ansi
  17. WriteLn('src0[', Length(src0), ']:', src0) ;
  18. tmp0 := TAN61.Encode(AnsiToUtf8(src0)) ;
  19. WriteLn('tmp0[', Length(tmp0), ']:', tmp0) ;
  20. out0 := Utf8ToAnsi(TAN61.Decode(tmp0)) ;
  21. WriteLn('out0[', Length(out0), ']:', out0) ;
  22. WriteLn('src0 = out0 : ', (src0 = out0)) ;
  23. WriteLn('----------UTF8String----------') ;
  24. utf8 := AnsiToUtf8('http://test.com:8080/an61.do?name=가나다 ㄱㄴ※'#10'可') ;
  25. WriteLn('utf8[', Length(utf8), ']:', Utf8ToAnsi(utf8)) ;
  26. tmp8 := TAN61.Encode(utf8) ;
  27. WriteLn('tmp8[', Length(tmp8), ']:', tmp8) ;
  28. out8 := TAN61.Decode(tmp8) ;
  29. WriteLn('out8[', Length(out8), ']:', Utf8ToAnsi(out8)) ;
  30. WriteLn('utf8 = out8 : ', (utf8 = out8)) ;
  31. WriteLn('----------WideString----------') ;
  32. wsrc := 'http://test.com:8080/an61.do?name=가나다 ㄱㄴ※'#10'可' ;
  33. WriteLn('wsrc[', Length(wsrc), ']:', wsrc) ;
  34. wtmp := TAN61.Encode(wsrc) ;
  35. WriteLn('wtmp[', Length(wtmp), ']:', wtmp) ;
  36. wout := UTF8Decode(TAN61.Decode(wtmp)) ;
  37. WriteLn('wout[', Length(wout), ']:', wout) ;
  38. WriteLn('wsrc = wout : ', (wsrc = wout)) ;
  39. Writeln('----------UTF8String----------') ;
  40. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  41. utf8 := UTF8Encode('http://test.com:8080/an61.do?name=가나다 ㄱㄴ※'#10'可') ;
  42. utf8 := utf8 + #240 ; // 0xF0 #240
  43. utf8 := utf8 + #159 ; // 0x9F #159
  44. utf8 := utf8 + #144 ; // 0x90 #144
  45. utf8 := utf8 + #152 ; // 0x98 #152
  46. //WriteLn('utf8[', Length(utf8), ']:', UTF8Decode(utf8)) ; // 코끼리 때문에 안됨.
  47. WriteLn('utf8[', Length(utf8), ']:', TZString.SafeUTF8Decode(utf8)) ;
  48. try
  49. tmp8 := TAN61.Encode(utf8) ;
  50. WriteLn('tmp8[', Length(tmp8), ']:', tmp8) ;
  51. out8 := TAN61.Decode(tmp8) ;
  52. //WriteLn('utf8[', Length(out8), ']:', UTF8Decode(out8)) ; // 코끼리 때문에 안됨.
  53. WriteLn('utf8[', Length(out8), ']:', TZString.SafeUTF8Decode(out8)) ;
  54. except
  55. on e: Exception do
  56. begin
  57. WriteLn('Error :', e.Message) ;
  58. tmp8 := TBase62.Encode(TZString.Utf8ToBytes(utf8)) ;
  59. Writeln('tmp8[', Length(tmp8), ']:', tmp8) ;
  60. out8 := TZString.BytesToUtf8(TBase62.Decode(tmp8)) ;
  61. //WriteLn('utf8[', Length(out8), ']:', UTF8Decode(out8)) ; // 코끼리 때문에 안됨.
  62. WriteLn('out8[', Length(out8), ']:', TZString.SafeUTF8Decode(out8)) ;
  63. WriteLn('out8 = out8 : ', (out8 = out8)) ;
  64. end ;
  65. end ;
  66. WriteLn('----------WideString------------') ;
  67. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  68. wsrc := 'http://test.com:8080/an61.do?name=가나다 ㄱㄴ※'#10'可' ;
  69. wsrc := wsrc + #55357 ; // 0xD83D #55357
  70. wsrc := wsrc + #56344 ; // 0xDC18 #56344
  71. WriteLn('wsrc[', Length(wsrc), ']:', wsrc) ;
  72. try
  73. wtmp := TAN61.Encode(wsrc) ;
  74. WriteLn('wtmp[', Length(wtmp), ']:', wtmp) ;
  75. wout := UTF8Decode(TAN61.Decode(wtmp)) ;
  76. WriteLn('wout[', Length(wout), ']:', wout) ;
  77. except
  78. on e: Exception do
  79. begin
  80. WriteLn('Error :', e.Message) ;
  81. //wtmp := TBase62.Encode(TZString.StringToBytes(UTF8Encode(wsrc))) ; // 코끼리 때문에 안됨.
  82. wtmp := TBase62.Encode(TZString.Utf8ToBytes(TZString.SafeUTF8Encode(wsrc))) ;
  83. WriteLn('wtmp[', Length(wtmp), ']:', wtmp) ;
  84. //wout := UTF8Decode(TZString.BytesToString(TBase62.Decode(wtmp))) ; // 코끼리 때문에 안됨.
  85. wout := TZString.SafeUTF8Decode(TZString.BytesToUtf8(TBase62.Decode(wtmp))) ;
  86. WriteLn('wout[', Length(wout), ']:', wout) ;
  87. WriteLn('wsrc = wout : ', (wsrc = wout)) ;
  88. end ;
  89. end ;
  90. ReadLn;
  91. end.

  1. ----------AnsiString------------
  2. src0[50]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  3. tmp0[76]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  4. out0[50]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  5. src0 = out0 : TRUE
  6. ----------UTF8String----------
  7. utf8[57]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  8. tmp8[76]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  9. out8[57]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  10. utf8 = out8 : TRUE
  11. ----------WideString----------
  12. wsrc[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  13. wtmp[76]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  14. wout[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  15. wsrc = wout : TRUE
  16. ----------UTF8String----------
  17. utf8[61]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  18. 可??
  19. Error :invalid UCS2 Character
  20. tmp8[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  21. out8[61]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  22. 可??
  23. out8 = out8 : TRUE
  24. ----------WideString------------
  25. wsrc[45]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  26. 可??
  27. Error :invalid UCS2 Character
  28. wtmp[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  29. wout[45]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  30. 可??
  31. wsrc = wout : TRUE

Pascal AN61 예 (Free Pascal)

  1. { charset : UTF-8 }
  2. program AN61Test;
  3. {$APPTYPE CONSOLE}
  4. uses
  5. SysUtils, AN61, ZString, Base62 ;
  6. var
  7. wsrc, wout : WideString ;
  8. wtmp, tmp8, tmp0 : string ;
  9. src0, out0 : AnsiString ;
  10. utf8, out8 : UTF8String ;
  11. begin
  12. WriteLn('----------UTF8String----------') ;
  13. utf8 := AnsiToUtf8(UTf8ToAnsi('http://test.com:8080/an61.do?name=가나다 ㄱㄴ※'#10'可')) ;
  14. WriteLn('utf8[', Length(utf8), ']:', Utf8ToAnsi(utf8)) ;
  15. tmp8 := TAN61.Encode(utf8) ;
  16. WriteLn('tmp8[', Length(tmp8), ']:', tmp8) ;
  17. out8 := TAN61.Decode(tmp8) ;
  18. WriteLn('out8[', Length(out8), ']:', Utf8ToAnsi(out8)) ;
  19. WriteLn('utf8 = out8 : ', (utf8 = out8)) ;
  20. WriteLn('----------AnsiString------------') ;
  21. src0 := Utf8ToAnsi('http://test.com:8080/an61.do?name=가나다 ㄱㄴ※'#10'可') ;
  22. WriteLn('src0[', Length(src0), ']:', src0) ;
  23. tmp0 := TAN61.Encode(AnsiToUtf8(src0)) ;
  24. WriteLn('tmp0[', Length(tmp0), ']:', tmp0) ;
  25. out0 := Utf8ToAnsi(TAN61.Decode(tmp0)) ;
  26. WriteLn('out0[', Length(out0), ']:', out0) ;
  27. WriteLn('src0 = out0 : ', (src0 = out0)) ;
  28. WriteLn('----------WideString----------') ;
  29. wsrc := UTF8Decode('http://test.com:8080/an61.do?name=가나다 ㄱㄴ※'#10'可') ;
  30. WriteLn('wsrc[', Length(wsrc), ']:', wsrc) ;
  31. wtmp := TAN61.Encode(wsrc) ;
  32. WriteLn('wtmp[', Length(wtmp), ']:', wtmp) ;
  33. wout := UTF8Decode(TAN61.Decode(wtmp)) ;
  34. WriteLn('wout[', Length(wout), ']:', wout) ;
  35. WriteLn('wsrc = wout : ', (wsrc = wout)) ;
  36. Writeln('----------UTF8String----------') ;
  37. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  38. utf8 := TZString.SafeUTF8Encode(UTF8Decode('http://test.com:8080/an61.do?name=가나다 ㄱㄴ※'#10'可🐘')) ;
  39. WriteLn('utf8[', Length(utf8), ']:', UTF8Decode(utf8)) ;
  40. try
  41. tmp8 := TAN61.Encode(utf8) ;
  42. WriteLn('tmp8[', Length(tmp8), ']', tmp8) ;
  43. out8 := TAN61.Decode(tmp8) ;
  44. WriteLn('utf8[', Length(out8), ']:', UTF8Decode(out8)) ;
  45. except
  46. on e: Exception do
  47. begin
  48. WriteLn('Error :', e.Message) ;
  49. tmp8 := TBase62.Encode(TZString.Utf8ToBytes(utf8)) ;
  50. WriteLn('tmp8[', Length(tmp8), ']:', tmp8) ;
  51. out8 := TZString.BytesToUtf8(TBase62.Decode(tmp8)) ;
  52. WriteLn('out8[', Length(out8), ']:', UTF8Decode(out8)) ;
  53. WriteLn('utf8 = out8 : ', (utf8 = out8)) ;
  54. end ;
  55. end ;
  56. WriteLn('----------WideString------------') ;
  57. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  58. wsrc := UTF8Decode('http://test.com:8080/an61.do?name=가나다 ㄱㄴ※'#10'可🐘') ;
  59. WriteLn('wsrc[', Length(wsrc), ']:', wsrc) ;
  60. try
  61. wtmp := TAN61.Encode(wsrc) ;
  62. WriteLn('wtmp[', Length(wtmp), ']:', wtmp) ;
  63. wout := TZString.StringToWideString(TAN61.Decode(wtmp), 65001) ;
  64. WriteLn('wout[', Length(wout), ']:', wout) ;
  65. except
  66. on e: Exception do
  67. begin
  68. WriteLn('Error :', e.Message) ;
  69. wtmp := TBase62.Encode(TZString.StringToBytes(UTF8Encode(wsrc))) ;
  70. WriteLn('wtmp[', Length(wtmp), ']:', wtmp) ;
  71. wout := UTF8Decode(TZString.BytesToString(TBase62.Decode(wtmp))) ;
  72. WriteLn('wout[', Length(wout), ']:', wout) ;
  73. WriteLn('wsrc = wout : ', (wsrc = wout)) ;
  74. end ;
  75. end ;
  76. ReadLn;
  77. end.

  1. ----------UTF8String----------
  2. utf8[57]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  3. tmp8[76]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  4. out8[57]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  5. utf8 = out8 : TRUE
  6. ----------AnsiString------------
  7. src0[50]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  8. tmp0[76]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  9. out0[50]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  10. src0 = out0 : TRUE
  11. ----------WideString----------
  12. wsrc[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  13. wtmp[76]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  14. wout[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  15. wsrc = wout : TRUE
  16. ----------UTF8String----------
  17. utf8[61]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  18. 可??
  19. Error :invalid UCS2 Character
  20. tmp8[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  21. out8[61]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  22. 可??
  23. utf8 = out8 : TRUE
  24. ----------WideString------------
  25. wsrc[45]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  26. 可??
  27. Error :invalid UCS2 Character
  28. wtmp[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  29. wout[45]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  30. 可??
  31. wsrc = wout : TRUE

PHP BASE62 예

  1. <?php require_once 'base62.php' ?>
  2. <!DOCTYPE html>
  3. <html>
  4. <body>
  5. <code>
  6. <?php
  7. function toHexa(string $str) {
  8. $bin = unpack('C*', $str) ;
  9. $len = count($bin) ;
  10. $ret = "" ;
  11. for($i = 1;$i <= $len; ++$i) {
  12. $ret .= sprintf("%02X ", $bin[$i]) ;
  13. if($i % 16 == 0)
  14. $ret .= "\n" ;
  15. else if($i % 16 == 8)
  16. $ret .= " " ;
  17. }
  18. return $ret ;
  19. }
  20. try {
  21. $bin = "" ;
  22. for($i = 0; $i < 256; ++$i)
  23. $bin .= chr($i) ;
  24. printf("----\$bin[%d]----<br/>", strlen($bin)) ;
  25. printf("%s<br/>", nl2br(toHexa($bin))) ;
  26. $txt = Base62::encode($bin) ;
  27. printf("txt:%s<br/>", nl2br($txt)) ;
  28. $out = Base62::decode($txt) ;
  29. printf("----\$out[%d]----<br/>", strlen($out)) ;
  30. printf("%s<br/>", nl2br(toHexa($out))) ;
  31. } catch(Exception $ex) {
  32. printf("Exception : %s<br/>", $ex->getMessage()) ;
  33. }
  34. ?>
  35. </code>
  36. </body>
  37. </html>

  1. ----$bin[256]----
  2. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  3. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  4. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  5. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  6. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  7. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  8. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  9. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  10. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  11. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  12. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  13. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  14. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  15. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  16. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  17. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
  18. txt:003x0kgb1WKF2Hws33aW3oEA4Zqn5LUR67856rki7dOM8P209Aed9vIHAguuBSYYCECCCyopDkSTEW67FHikG3MOGo02HZcfILGJJ6swJrWaKdAELOmrMAQVMv49NggmOSKQPDx4PyahQkELRVqySHUcT38GTnktUZOXVL2BW6eoWrISXcv6YOYjZACNZup1agSebS6IcDivcyMZdk0DeVcqfHGUg2t8gnWlhZAPiKn3j6Qgjr4KkcgxlOKbm9xFmuasngEWoRrApDUnpy8Rqjl5rVOisH2Mt2f0tnIduYvHvKYuw6CYwqpCxcSpyO6TzWKagzWKo7zWL2XzWLFxzWLTOz0V
  19. ----$out[256]----
  20. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  21. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  22. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  23. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  24. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  25. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  26. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  27. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  28. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  29. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  30. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  31. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  32. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  33. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  34. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  35. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

PHP AN61 예

  1. <?php require_once 'an61.php' ?>
  2. <?php require_once 'base62.php' ?>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. </head>
  8. <body>
  9. <code>
  10. <?php
  11. try {
  12. $src0 = "http://test.com:8080/an61.do?name=가나다 ㄱㄴ※\n可" ;
  13. printf("src0[%d] : %s<br/>", strlen($src0), nl2br($src0)) ;
  14. $an61__tmp0 = AN61::encode($src0) ;
  15. printf("an61__tmp0:%s<br/>", nl2br($an61__tmp0)) ;
  16. $an61__out0 = AN61::decode($an61__tmp0) ;
  17. printf("an61__out0:%s<br/>", nl2br($an61__out0)) ;
  18. $base64_tmp = base64_encode($src0) ;
  19. printf("base64_tmp:%s<br/>", nl2br($base64_tmp)) ;
  20. $base64_out = base64_decode($base64_tmp) ;
  21. printf("base64_out:%s<br/>", nl2br($base64_out)) ;
  22. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  23. $src1 = "http://test.com:8080/an61.do?name=가나다 ㄱㄴ※\n可🐘" ;
  24. printf("src1[%d]:%s<br/>", strlen($src1), nl2br($src1)) ;
  25. try {
  26. $tmp1 = AN61::encode($src1) ;
  27. printf("tmp1:%s<br/>", nl2br($tmp1)) ;
  28. $out1 = AN61::decode($tmp1) ;
  29. printf("out1:%s<br/>", nl2br($out1)) ;
  30. }
  31. catch(Exception $e) {
  32. printf("Exception : %s<br/>", $e->getMessage()) ;
  33. $tmp2 = Base62::encode($src1) ;
  34. printf("tmp2:%s<br/>", nl2br($tmp2)) ;
  35. $out2 = Base62::decode($tmp2) ;
  36. printf("out2:%s<br/>", nl2br($out2)) ;
  37. if($src1 === $out2) echo("src1 === out2<br/>") ;
  38. }
  39. } catch(Exception $ex) {
  40. printf("Exception : %s<br/>", $ex->getMessage()) ;
  41. }
  42. ?>
  43. </code>
  44. </body>
  45. </html>

  1. src0[57] : http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  2. an61__tmp0:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  3. an61__out0:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  4. base64_tmp:aHR0cDovL3Rlc3QuY29tOjgwODAvYW42MS5kbz9uYW1lPeqwgOuCmOuLpCDjhLHjhLTigLsK5Y+v
  5. base64_out:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  6. src1[61]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  7. 可🐘
  8. Exception : invalid UCS2 character
  9. tmp2:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  10. out2:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  11. 可🐘
  12. src1 === out2

Kotlin BASE62 예

  1. fun bin2hexa(bin: ByteArray): String {
  2. val ret = StringBuilder()
  3. for (i in bin.indices) {
  4. ret.append(String.format("%02X ", bin[i]))
  5. when (i % 16) {
  6. 7 -> ret.append(" ")
  7. 15 -> ret.append("\n")
  8. }
  9. }
  10. if (bin.size % 16 != 0) ret.append("\n")
  11. return ret.toString()
  12. }
  13. fun main(args: Array<String>) {
  14. try {
  15. val bin = ByteArray(256)
  16. for (i in bin.indices) bin[i] = i.toByte()
  17. println("----bin[" + bin.size + "]----")
  18. println(bin2hexa(bin))
  19. val txt = Base62.encode(bin)
  20. println("txt[" + txt.length + "]:" + txt)
  21. val out = Base62.decode(txt)
  22. println("----out[" + out.size + "]----")
  23. println(bin2hexa(out))
  24. } catch (e: Exception) {
  25. e.printStackTrace()
  26. }
  27. }

  1. ----bin[256]----
  2. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  3. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  4. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  5. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  6. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  7. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  8. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  9. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  10. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  11. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  12. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  13. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  14. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  15. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  16. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  17. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
  18. txt[348]:003x0kgb1WKF2Hws33aW3oEA4Zqn5LUR67856rki7dOM8P209Aed9vIHAguuBSYYCECCCyopDkSTEW67FHikG3MOGo02HZcfILGJJ6swJrWaKdAELOmrMAQVMv49NggmOSKQPDx4PyahQkELRVqySHUcT38GTnktUZOXVL2BW6eoWrISXcv6YOYjZACNZup1agSebS6IcDivcyMZdk0DeVcqfHGUg2t8gnWlhZAPiKn3j6Qgjr4KkcgxlOKbm9xFmuasngEWoRrApDUnpy8Rqjl5rVOisH2Mt2f0tnIduYvHvKYuw6CYwqpCxcSpyO6TzWKagzWKo7zWL2XzWLFxzWLTOz0V
  19. ----out[256]----
  20. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  21. 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  22. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  23. 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  24. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  25. 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  26. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  27. 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  28. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
  29. 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
  30. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
  31. B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
  32. C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
  33. D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
  34. E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
  35. F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

Kotlin AN61 예

  1. import java.io.UnsupportedEncodingException
  2. import java.util.*
  3. fun main(args: Array<String>) {
  4. try {
  5. val src0 = "http://test.com:8080/an61.do?name=가나다 ㄱㄴ※\n可"
  6. println("src0[" + src0.length + "]:" + src0)
  7. val an61__tmp0: String = AN61.encode(src0)
  8. println("an61__tmp0[" + an61__tmp0.length + "]:" + an61__tmp0)
  9. val an61__out0: String = AN61.decode(an61__tmp0)
  10. println("an61__out0[" + an61__out0.length + "]:" + an61__out0)
  11. println("src0.equals(an61__out0) : " + (src0 == an61__out0))
  12. val base64_tmp = Base64.getEncoder().encodeToString(src0.toByteArray(charset("utf8")))
  13. println("base64_tmp[" + base64_tmp.length + "]:" + base64_tmp)
  14. val base64_out = String(Base64.getDecoder().decode(base64_tmp), charset("utf8"))
  15. println("base64_out[" + base64_out.length + "]:" + base64_out)
  16. // [ 코끼리 = Unicode : 01F418, UTF16 : D83D DC18, UTF8 : F0 9F 90 98 ]
  17. val src1 = "http://test.com:8080/an61.do?name=가나다 ㄱㄴ※\n可🐘" // UnsupportedEncodingException이 발생하는 경우
  18. println("src1[" + src1.length + "]:" + src1) // String.length()은 문자갯수가 아니라, UTF16의 길이다.
  19. try {
  20. val tmp1: String = AN61.encode(src1)
  21. println("tmp1:$tmp1")
  22. val out1: String = AN61.decode(tmp1)
  23. println("out1:$out1")
  24. } catch (uee: UnsupportedEncodingException) {
  25. System.err.println(uee)
  26. val tmp2: String = Base62.encode(src1.toByteArray(charset("utf8")))
  27. println("tmp2[" + tmp2.length + "]:" + tmp2)
  28. val out2 = String(Base62.decode(tmp2), charset("utf8"))
  29. println("out2[" + out2.length + "]:" + out2)
  30. println("src1.equals(out2) : " + (src1 == out2))
  31. }
  32. } catch (e: Exception) {
  33. e.printStackTrace()
  34. }
  35. }

  1. src0[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  2. an61__tmp0[76]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7Y
  3. an61__out0[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  4. src0.equals(an61__out0) : true
  5. base64_tmp[76]:aHR0cDovL3Rlc3QuY29tOjgwODAvYW42MS5kbz9uYW1lPeqwgOuCmOuLpCDjhLHjhLTigLsK5Y+v
  6. base64_out[43]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  7. src1[45]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  8. 可🐘
  9. tmp2[83]:QVOZSTTLC33NTIeJPEfTElRKEFxJOid7CTUTSEKmOiZwFiOXWiaIco6jfdmdXfmjXfyWWfSTwG7YzIeAi2U
  10. out2[45]:http://test.com:8080/an61.do?name=가나다 ㄱㄴ※
  11. 可🐘
  12. src1.equals(out2) : true
  13. java.io.UnsupportedEncodingException: invalid UCS2 character index 43 🐘