utf8map.pl
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:2k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. #!/usr/bin/perl -wn
  2. #
  3. # utf8map.pl - remap ascii to utf8
  4. #
  5. # Program was created to build conversion table from ascii into utf8.
  6. # Ascii table's first half does not require any changes (because utf8
  7. # [0-127] encoding is the same as in ascii). To control second half's
  8. # encoding we have to specify all unicode codes for characters in
  9. # [128-255] interval. Program takes unicode codes for 128 characters
  10. # on input (in hex format with leading 0x) and generates conversion table .
  11. # Every utf8 code is padded by '0' and occupies 4 bytes.
  12. # It is suitable for use in 'C' programs.
  13. #
  14. # For example,
  15. #  in windows-1257 table character 169 '(c)' has code 0x00A9 in unicode.
  16. #  Program will generate folowing string:
  17. #
  18. #  0xC2, 0xA9, 0x00, 0x00, /*   169           0x00a9 */
  19. # ______________________/     ___/         ______/
  20. #    utf8 code (2 bytes        ascii         unicode
  21. #    with padding)
  22. #
  23. # USAGE:
  24. #   perl utf8map.pl asci_128-255_unicode_table.txt
  25. #
  26. # Andrejs Dubovskis
  27. #
  28. use strict ;
  29. use vars qw/$N/ ;
  30. BEGIN {
  31.   # we going to prepare table for characters in 128-255 interval
  32.   $N = 128 ;
  33. }
  34. # look for hex number (unicode)
  35. for my $hex (/0x[da-f]+/ig) {
  36.   my $num = hex($hex) ;
  37.   my @out = () ;
  38.   if ($num > 0xffff) {
  39.     die "too large number: $hex" ;
  40.   } elsif ($num > 0x07ff) {
  41.     # result is three bytes long
  42.     @out = (
  43.     (($num >> 12) & 0xf) | 0xe0,
  44.     (($num >> 6) & 0x3f) | 0x80,
  45.     ($num & 0x3f) | 0x80
  46.    ) ;
  47.   } elsif ($num > 0x7f) {
  48.     # result is two bytes long
  49.     @out = (
  50.     (($num >> 6) & 0x1f) | 0xc0,
  51.     ($num & 0x3f) | 0x80
  52.    ) ;
  53.   } else {
  54.     # only zero is legal here
  55.     die "wrong input data: $hex" if $num ;
  56.   }
  57.   # pad by '0'
  58.   push(@out, 0) while @out < 4 ;
  59.   # output utf8 code
  60.   printf("0x%02X,t0x%02X,t0x%02X,t0x%02X,t", @out) ;
  61.   # output comments
  62.   print "/*t$Nt$hext*/n" ;
  63.   # characters in [128-255] interval only
  64.   exit if ++$N > 255 ;
  65. }