| [3531] | 1 | # Movable Type (r) Open Source (C) 2001-2009 Six Apart, Ltd. |
|---|
| [1104] | 2 | # This program is distributed under the terms of the |
|---|
| 3 | # GNU General Public License, version 2. |
|---|
| [1098] | 4 | # |
|---|
| 5 | # $Id$ |
|---|
| 6 | |
|---|
| 7 | package MT::I18N::default; |
|---|
| 8 | |
|---|
| 9 | use strict; |
|---|
| 10 | use base qw( MT::ErrorHandler ); |
|---|
| 11 | our $PKG; |
|---|
| 12 | |
|---|
| [1524] | 13 | sub DEFAULT_LENGTH_ENTRY_EXCERPT () { 40 } |
|---|
| 14 | sub LENGTH_ENTRY_TITLE_FROM_TEXT () { 5 } |
|---|
| 15 | sub LENGTH_ENTRY_PING_EXCERPT () { 255 } |
|---|
| 16 | sub LENGTH_ENTRY_PING_TITLE_FROM_TEXT () { 5 } |
|---|
| 17 | sub DISPLAY_LENGTH_MENU_TITLE () { 22 } |
|---|
| 18 | sub DISPLAY_LENGTH_EDIT_COMMENT_TITLE () { 25 } |
|---|
| 19 | sub DISPLAY_LENGTH_EDIT_COMMENT_AUTHOR () { 25 } |
|---|
| 20 | sub DISPLAY_LENGTH_EDIT_COMMENT_TEXT_SHORT () { 45 } |
|---|
| 21 | sub DISPLAY_LENGTH_EDIT_COMMENT_TEXT_LONG () { 90 } |
|---|
| 22 | sub DISPLAY_LENGTH_EDIT_COMMENT_TEXT_BREAK_UP_SHORT () { 30 } |
|---|
| 23 | sub DISPLAY_LENGTH_EDIT_COMMENT_TEXT_BREAK_UP_LONG () { 80 } |
|---|
| 24 | sub DISPLAY_LENGTH_EDIT_PING_TITLE_FROM_EXCERPT () { 12 } |
|---|
| 25 | sub DISPLAY_LENGTH_EDIT_PING_BREAK_UP () { 30 } |
|---|
| 26 | sub DISPLAY_LENGTH_EDIT_ENTRY_TITLE () { 25 } |
|---|
| 27 | sub DISPLAY_LENGTH_EDIT_ENTRY_TEXT_FROM_EXCERPT () { 50 } |
|---|
| 28 | sub DISPLAY_LENGTH_EDIT_ENTRY_TEXT_BREAK_UP () { 30 } |
|---|
| [1098] | 29 | |
|---|
| [2967] | 30 | sub PORTAL_URL() { '' } # default PORTAL_URL is determined in building packages |
|---|
| [2929] | 31 | sub SUPPORT_URL() { 'http://www.sixapart.com/movabletype/support/' } |
|---|
| 32 | sub NEWS_URL() { 'http://www.sixapart.com/movabletype/news/' } |
|---|
| 33 | sub NEWSBOX_URL() { 'http://www.sixapart.com/movabletype/news/mt4_news_widget.html' } |
|---|
| 34 | sub LEARNINGNEWS_URL() { 'http://learning.movabletype.org/newsbox.html' } |
|---|
| 35 | sub CATEGORY_NAME_NODASH() { 0 } |
|---|
| 36 | sub DEFAULT_TIMEZONE() { 0 } |
|---|
| 37 | sub MAIL_ENCODING() { 'ISO-8859-1' } |
|---|
| 38 | sub LOG_EXPORT_ENCODING() { '' } |
|---|
| 39 | sub EXPORT_ENCODING() { '' } |
|---|
| 40 | sub PUBLISH_CHARSET() { 'UTF-8' } |
|---|
| 41 | |
|---|
| [1524] | 42 | my $ENCODING_NAMES = [ |
|---|
| [1098] | 43 | { 'name' => 'guess', 'display_name' => 'AUTO DETECT' }, |
|---|
| 44 | { 'name' => 'utf8', 'display_name' => 'UTF-8' }, |
|---|
| 45 | { 'name' => 'ascii', 'display_name' => 'ISO-8859-1' }, |
|---|
| 46 | { 'name' => 'WinLatin1', 'display_name' => 'Windows Latin1' }, |
|---|
| 47 | ]; |
|---|
| [1524] | 48 | sub ENCODING_NAMES () { |
|---|
| 49 | return $ENCODING_NAMES; |
|---|
| 50 | } |
|---|
| [1098] | 51 | |
|---|
| 52 | my @ENCODINGS_ENCODE = |
|---|
| 53 | qw( cp1252 utf-8 euc-jp shiftjis 7bit-jis iso-2022-jp |
|---|
| 54 | iso-2022-jp-1 jis0201-raw jis0208-raw |
|---|
| 55 | jis0212-raw cp932 Macjapanese iso-8859-1 ); |
|---|
| 56 | |
|---|
| 57 | sub decode { |
|---|
| 58 | my $class = shift; |
|---|
| 59 | my $meth = 'decode_' . ($PKG || $class->_load_module); |
|---|
| 60 | $class->$meth(@_); |
|---|
| 61 | } |
|---|
| [3531] | 62 | |
|---|
| 63 | sub encode { |
|---|
| 64 | my $class = shift; |
|---|
| 65 | my $meth = 'encode_' . ($PKG || $class->_load_module); |
|---|
| 66 | $class->$meth(@_); |
|---|
| 67 | } |
|---|
| 68 | |
|---|
| [1098] | 69 | sub guess_encoding { |
|---|
| 70 | my $class = shift; |
|---|
| 71 | my $meth = 'guess_encoding_' . ($PKG || $class->_load_module); |
|---|
| 72 | $class->$meth(@_); |
|---|
| 73 | } |
|---|
| 74 | sub encode_text { |
|---|
| 75 | my $class = shift; |
|---|
| 76 | my $meth = "encode_text_" . ($PKG || $class->_load_module); |
|---|
| 77 | $class->$meth(@_); |
|---|
| 78 | } |
|---|
| 79 | sub substr_text { |
|---|
| 80 | my $class = shift; |
|---|
| 81 | my $meth = "substr_text_" . ($PKG || $class->_load_module); |
|---|
| 82 | $class->$meth(@_); |
|---|
| 83 | } |
|---|
| 84 | sub wrap_text { |
|---|
| 85 | my $class = shift; |
|---|
| 86 | my $meth = "wrap_text_" . ($PKG || $class->_load_module); |
|---|
| 87 | $class->$meth(@_); |
|---|
| 88 | } |
|---|
| 89 | sub length_text { |
|---|
| 90 | my $class = shift; |
|---|
| 91 | my $meth = "length_text_" . ($PKG || $class->_load_module); |
|---|
| 92 | $class->$meth(@_); |
|---|
| 93 | } |
|---|
| 94 | sub first_n { |
|---|
| 95 | my $class = shift; |
|---|
| 96 | my $meth = "first_n_" . ($PKG || $class->_load_module); |
|---|
| 97 | $class->$meth(@_); |
|---|
| 98 | } |
|---|
| 99 | sub first_n_text { |
|---|
| 100 | my $class = shift; |
|---|
| 101 | my $meth = "first_n_" . ($PKG || $class->_load_module); |
|---|
| 102 | $class->$meth(@_); |
|---|
| 103 | } |
|---|
| 104 | sub break_up_text { |
|---|
| 105 | my $class = shift; |
|---|
| 106 | my $meth = "break_up_text_" . ($PKG || $class->_load_module); |
|---|
| 107 | $class->$meth(@_); |
|---|
| 108 | } |
|---|
| 109 | sub convert_high_ascii { |
|---|
| 110 | my $class = shift; |
|---|
| 111 | my $meth = "convert_high_ascii_" . ($PKG || $class->_load_module); |
|---|
| 112 | $class->$meth(@_); |
|---|
| 113 | } |
|---|
| [3531] | 114 | |
|---|
| [1098] | 115 | sub decode_utf8 { |
|---|
| 116 | my $class = shift; |
|---|
| 117 | my $meth = "decode_utf8_" . ($PKG || $class->_load_module); |
|---|
| 118 | $class->$meth(@_); |
|---|
| 119 | } |
|---|
| 120 | |
|---|
| 121 | sub utf8_off { |
|---|
| 122 | my $class = shift; |
|---|
| 123 | my $meth = "utf8_off_" . ($PKG || $class->_load_module); |
|---|
| 124 | $class->$meth(@_); |
|---|
| 125 | } |
|---|
| 126 | |
|---|
| 127 | sub lowercase { |
|---|
| 128 | my $class = shift; |
|---|
| 129 | my $meth = 'lowercase_' . ($PKG || $class->_load_module); |
|---|
| 130 | $class->$meth(@_); |
|---|
| 131 | } |
|---|
| 132 | |
|---|
| 133 | sub uppercase { |
|---|
| 134 | my $class = shift; |
|---|
| 135 | my $meth = 'uppercase_' . ($PKG || $class->_load_module); |
|---|
| 136 | $class->$meth(@_); |
|---|
| 137 | } |
|---|
| 138 | |
|---|
| 139 | # Dumb default methods (charset ignorant) |
|---|
| 140 | |
|---|
| 141 | sub decode_perl { |
|---|
| 142 | my $class = shift; |
|---|
| 143 | my ($enc, $text) = @_; |
|---|
| 144 | $text; |
|---|
| 145 | } |
|---|
| 146 | |
|---|
| [3531] | 147 | sub encode_perl { |
|---|
| 148 | my $class = shift; |
|---|
| 149 | my ($enc, $text) = @_; |
|---|
| 150 | $text; |
|---|
| 151 | } |
|---|
| 152 | |
|---|
| [1098] | 153 | sub encode_text_perl { |
|---|
| 154 | my $class = shift; |
|---|
| 155 | my ($str) = @_; |
|---|
| 156 | $str; |
|---|
| 157 | } |
|---|
| 158 | |
|---|
| 159 | sub substr_text_perl { |
|---|
| 160 | my $class = shift; |
|---|
| 161 | my ($str, $start, $end) = @_; |
|---|
| 162 | substr($str, $start, $end); |
|---|
| 163 | } |
|---|
| 164 | |
|---|
| 165 | sub lowercase_perl { |
|---|
| 166 | my $class = shift; |
|---|
| 167 | my ($str) = @_; |
|---|
| 168 | return lc $str; |
|---|
| 169 | } |
|---|
| 170 | |
|---|
| 171 | sub uppercase_perl { |
|---|
| 172 | my $class = shift; |
|---|
| 173 | my ($str) = @_; |
|---|
| 174 | return uc $str; |
|---|
| 175 | } |
|---|
| 176 | |
|---|
| 177 | sub length_text_perl { |
|---|
| 178 | my $class = shift; |
|---|
| 179 | my ($str) = @_; |
|---|
| 180 | length($str); |
|---|
| 181 | } |
|---|
| 182 | |
|---|
| 183 | sub guess_encoding_perl { |
|---|
| 184 | MT->config('PublishCharset'); |
|---|
| 185 | } |
|---|
| 186 | |
|---|
| 187 | sub wrap_text_perl { |
|---|
| 188 | my $class = shift; |
|---|
| 189 | my ($text, $col, $tab_init, $tab_sub) = @_; |
|---|
| 190 | $tab_init = '' unless defined $tab_init; |
|---|
| 191 | $tab_sub = '' unless defined $tab_sub; |
|---|
| 192 | require Text::Wrap; |
|---|
| 193 | $Text::Wrap::columns = $col; |
|---|
| 194 | $text = Text::Wrap::wrap($tab_init, $tab_sub, $text); |
|---|
| 195 | return $text; |
|---|
| 196 | } |
|---|
| 197 | |
|---|
| 198 | sub first_n_perl { |
|---|
| 199 | my $class = shift; |
|---|
| 200 | my ($text, $length) = @_; |
|---|
| 201 | require MT::Util; |
|---|
| 202 | $text = MT::Util::first_n_words($text, $length); |
|---|
| 203 | return $text; |
|---|
| 204 | } |
|---|
| 205 | |
|---|
| 206 | sub break_up_text_perl { |
|---|
| 207 | my $class = shift; |
|---|
| 208 | my ($text, $length) = @_; |
|---|
| 209 | return '' unless defined $text; |
|---|
| 210 | $text =~ s/(\S{$length})/$1 /g; |
|---|
| 211 | return $text; |
|---|
| 212 | } |
|---|
| 213 | |
|---|
| 214 | # Encode package methods |
|---|
| 215 | |
|---|
| 216 | sub convert_high_ascii_encode { |
|---|
| 217 | &convert_high_ascii_perl; |
|---|
| 218 | } |
|---|
| 219 | |
|---|
| 220 | sub wrap_text_encode { |
|---|
| 221 | my $class = shift; |
|---|
| 222 | my ($text, $col, $tab_init, $tab_sub) = @_; |
|---|
| 223 | $tab_init = '' unless defined $tab_init; |
|---|
| 224 | $tab_sub = '' unless defined $tab_sub; |
|---|
| 225 | require Text::Wrap; |
|---|
| [1102] | 226 | $Text::Wrap::columns = $col; |
|---|
| [1098] | 227 | $text = Text::Wrap::wrap($tab_init, $tab_sub, $text); |
|---|
| 228 | return $text; |
|---|
| 229 | } |
|---|
| 230 | |
|---|
| 231 | sub first_n_encode { |
|---|
| 232 | # passthru first_n_words |
|---|
| 233 | my $class = shift; |
|---|
| 234 | my ($text, $length) = @_; |
|---|
| 235 | require MT::Util; |
|---|
| 236 | $text = MT::Util::first_n_words($text, $length); |
|---|
| 237 | return $text; |
|---|
| 238 | } |
|---|
| 239 | |
|---|
| 240 | sub break_up_text_encode { |
|---|
| 241 | my $class = shift; |
|---|
| 242 | my ($text, $length) = @_; |
|---|
| 243 | return '' unless defined $text; |
|---|
| 244 | $text =~ s/(\S{$length})/$1 /g; |
|---|
| 245 | return $text; |
|---|
| 246 | } |
|---|
| 247 | |
|---|
| 248 | my %HighASCII = ( |
|---|
| 249 | "\xc0" => 'A', # A` |
|---|
| 250 | "\xe0" => 'a', # a` |
|---|
| 251 | "\xc1" => 'A', # A' |
|---|
| 252 | "\xe1" => 'a', # a' |
|---|
| 253 | "\xc2" => 'A', # A^ |
|---|
| 254 | "\xe2" => 'a', # a^ |
|---|
| 255 | "\xc4" => 'A', # A: |
|---|
| 256 | "\xe4" => 'a', # a: |
|---|
| 257 | "\xc5" => 'A', # Aring |
|---|
| 258 | "\xe5" => 'a', # aring |
|---|
| 259 | "\xc6" => 'AE', # AE |
|---|
| 260 | "\xe6" => 'ae', # ae |
|---|
| 261 | "\xc3" => 'A', # A~ |
|---|
| 262 | "\xe3" => 'a', # a~ |
|---|
| 263 | "\xc8" => 'E', # E` |
|---|
| 264 | "\xe8" => 'e', # e` |
|---|
| 265 | "\xc9" => 'E', # E' |
|---|
| 266 | "\xe9" => 'e', # e' |
|---|
| 267 | "\xca" => 'E', # E^ |
|---|
| 268 | "\xea" => 'e', # e^ |
|---|
| 269 | "\xcb" => 'E', # E: |
|---|
| 270 | "\xeb" => 'e', # e: |
|---|
| 271 | "\xcc" => 'I', # I` |
|---|
| 272 | "\xec" => 'i', # i` |
|---|
| 273 | "\xcd" => 'I', # I' |
|---|
| 274 | "\xed" => 'i', # i' |
|---|
| 275 | "\xce" => 'I', # I^ |
|---|
| 276 | "\xee" => 'i', # i^ |
|---|
| 277 | "\xcf" => 'I', # I: |
|---|
| 278 | "\xef" => 'i', # i: |
|---|
| 279 | "\xd2" => 'O', # O` |
|---|
| 280 | "\xf2" => 'o', # o` |
|---|
| 281 | "\xd3" => 'O', # O' |
|---|
| 282 | "\xf3" => 'o', # o' |
|---|
| 283 | "\xd4" => 'O', # O^ |
|---|
| 284 | "\xf4" => 'o', # o^ |
|---|
| 285 | "\xd6" => 'O', # O: |
|---|
| 286 | "\xf6" => 'o', # o: |
|---|
| 287 | "\xd5" => 'O', # O~ |
|---|
| 288 | "\xf5" => 'o', # o~ |
|---|
| 289 | "\xd8" => 'O', # O/ |
|---|
| 290 | "\xf8" => 'o', # o/ |
|---|
| 291 | "\xd9" => 'U', # U` |
|---|
| 292 | "\xf9" => 'u', # u` |
|---|
| 293 | "\xda" => 'U', # U' |
|---|
| 294 | "\xfa" => 'u', # u' |
|---|
| 295 | "\xdb" => 'U', # U^ |
|---|
| 296 | "\xfb" => 'u', # u^ |
|---|
| 297 | "\xdc" => 'U', # U: |
|---|
| 298 | "\xfc" => 'u', # u: |
|---|
| 299 | "\xc7" => 'C', # ,C |
|---|
| 300 | "\xe7" => 'c', # ,c |
|---|
| 301 | "\xd1" => 'N', # N~ |
|---|
| 302 | "\xf1" => 'n', # n~ |
|---|
| 303 | "\xdd" => 'Y', # Yacute |
|---|
| 304 | "\xfd" => 'y', # yacute |
|---|
| 305 | "\xdf" => 'ss', # szlig |
|---|
| 306 | "\xff" => 'y' # yuml |
|---|
| 307 | ); |
|---|
| 308 | my $HighASCIIRE = join '|', keys %HighASCII; |
|---|
| 309 | |
|---|
| 310 | sub convert_high_ascii_perl { |
|---|
| 311 | my $class = shift; |
|---|
| 312 | my ($s) = @_; |
|---|
| 313 | $s =~ s/($HighASCIIRE)/$HighASCII{$1}/g; |
|---|
| 314 | $s; |
|---|
| 315 | } |
|---|
| 316 | |
|---|
| 317 | sub _set_encode { |
|---|
| 318 | my $class = shift; |
|---|
| 319 | my ($text, $enc) = @_; |
|---|
| 320 | |
|---|
| 321 | if (defined($enc)) { |
|---|
| 322 | unless ($enc) { |
|---|
| 323 | my $meth = 'guess_encoding_' . lc $PKG; |
|---|
| 324 | $enc = $class->$meth($text); |
|---|
| 325 | } |
|---|
| 326 | } else { |
|---|
| 327 | $enc = MT->config('PublishCharset') || 'utf-8'; |
|---|
| 328 | } |
|---|
| 329 | return $enc; |
|---|
| 330 | } |
|---|
| 331 | |
|---|
| 332 | sub guess_encoding_encode { |
|---|
| 333 | my $class = shift; |
|---|
| 334 | my ($text) = @_; |
|---|
| 335 | require Encode::Guess; |
|---|
| 336 | Encode::Guess->set_suspects(MT->config('PublishCharset'), @ENCODINGS_ENCODE); |
|---|
| 337 | my $dec = Encode::Guess->guess($text); |
|---|
| 338 | if (ref($dec)) { |
|---|
| 339 | return $dec->name; |
|---|
| 340 | } else { |
|---|
| 341 | # if Encode was failed to guess, re-try for each encodings. |
|---|
| 342 | for my $encode_name ( MT->config('PublishCharset'), @ENCODINGS_ENCODE ) { |
|---|
| 343 | Encode::Guess->set_suspects($encode_name); |
|---|
| 344 | $dec = Encode::Guess->guess($text); |
|---|
| 345 | if (ref($dec)) { |
|---|
| 346 | return $dec->name; |
|---|
| 347 | } |
|---|
| 348 | } |
|---|
| 349 | return MT->config('PublishCharset') || 'utf-8'; |
|---|
| 350 | } |
|---|
| 351 | } |
|---|
| 352 | |
|---|
| 353 | sub substr_text_encode { |
|---|
| 354 | my $class = shift; |
|---|
| 355 | my ($text, $startpos, $length, $enc) = @_; |
|---|
| 356 | $enc = $class->_set_encode($text, $enc); |
|---|
| 357 | $text = $class->_conv_to_utf8($text, $enc) if $enc ne 'utf-8'; |
|---|
| 358 | Encode::_utf8_on($text); |
|---|
| 359 | $text = substr($text, $startpos, $length); |
|---|
| 360 | Encode::_utf8_off($text); |
|---|
| 361 | $text = $class->_conv_from_utf8($text, $enc) if $enc ne 'utf-8'; |
|---|
| 362 | $text; |
|---|
| 363 | } |
|---|
| 364 | |
|---|
| 365 | sub length_text_encode { |
|---|
| 366 | my $class = shift; |
|---|
| 367 | my ($text, $enc) = @_; |
|---|
| 368 | $enc = $class->_set_encode($text, $enc); |
|---|
| 369 | my $enc_text = $class->_conv_to_utf8($text, $enc); |
|---|
| 370 | Encode::_utf8_on($enc_text); |
|---|
| 371 | return length($enc_text); |
|---|
| 372 | } |
|---|
| 373 | |
|---|
| 374 | sub lowercase_encode { |
|---|
| 375 | my $class = shift; |
|---|
| 376 | my ($str, $enc) = @_; |
|---|
| 377 | $enc = $class->_set_encode($str, $enc); |
|---|
| 378 | $str = $class->_conv_to_utf8($str, $enc) if $enc ne 'utf-8'; |
|---|
| 379 | Encode::_utf8_on($str); |
|---|
| 380 | $str = lc $str; |
|---|
| 381 | Encode::_utf8_off($str); |
|---|
| 382 | $str = $class->_conv_from_utf8($str, $enc) if $enc ne 'utf-8'; |
|---|
| 383 | return $str; |
|---|
| 384 | } |
|---|
| 385 | |
|---|
| 386 | sub uppercase_encode { |
|---|
| 387 | my $class = shift; |
|---|
| 388 | my ($str, $enc) = @_; |
|---|
| 389 | $enc = $class->_set_encode($str, $enc); |
|---|
| 390 | $str = $class->_conv_to_utf8($str, $enc) if $enc ne 'utf-8'; |
|---|
| 391 | Encode::_utf8_on($str); |
|---|
| 392 | $str = uc $str; |
|---|
| 393 | Encode::_utf8_off($str); |
|---|
| 394 | $str = $class->_conv_from_utf8($str, $enc) if $enc ne 'utf-8'; |
|---|
| 395 | return $str; |
|---|
| 396 | } |
|---|
| 397 | |
|---|
| 398 | sub encode_text_encode { |
|---|
| 399 | my $class = shift; |
|---|
| 400 | my($text, $from, $to) = @_; |
|---|
| 401 | $from ||= $class->guess_encoding($text); |
|---|
| 402 | $from = 'euc-jp' if $from eq 'euc'; |
|---|
| 403 | $to ||= MT->config('PublishCharset') || 'utf-8'; |
|---|
| 404 | $to = 'euc-jp' if $to eq 'euc'; |
|---|
| 405 | |
|---|
| 406 | if ($from ne $to) { |
|---|
| 407 | #Encode::_utf8_off($text); |
|---|
| 408 | eval { |
|---|
| 409 | if ( ( ( 'iso-2022-jp' eq lc($to) ) || ( 'shift_jis' eq lc($to) ) ) |
|---|
| 410 | && ( 'utf-8' eq lc($from)) ) |
|---|
| 411 | { |
|---|
| 412 | $text = Encode::decode($from, $text); |
|---|
| 413 | #FULLWIDTH TILDE to WAVE DASH |
|---|
| 414 | $text =~ s/\x{ff5e}/\x{301c}/g; |
|---|
| 415 | #PARALLEL TO to DOUBLE VERTICAL LINE |
|---|
| 416 | $text =~ s/\x{2225}/\x{2016}/g; |
|---|
| 417 | #FULLWIDTH HYPHEN-MINUS to MINUS SIGN |
|---|
| 418 | $text =~ s/\x{ff0d}/\x{2212}/g; |
|---|
| 419 | #FULLWIDTH CENT SIGN to CENT SIGN |
|---|
| 420 | $text =~ s/\x{ffe0}/\x{00a2}/g; |
|---|
| 421 | #FULLWIDTH POUND SIGN to POUND SIGN |
|---|
| 422 | $text =~ s/\x{ffe1}/\x{00a3}/g; |
|---|
| 423 | #FULLWIDTH NOT SIGN to NOT SIGN |
|---|
| 424 | $text =~ s/\x{ffe2}/\x{00ac}/g; |
|---|
| 425 | $text = Encode::encode($to, $text); |
|---|
| 426 | } else { |
|---|
| 427 | Encode::from_to($text, $from, $to); |
|---|
| 428 | } |
|---|
| 429 | }; |
|---|
| 430 | if (my $err = $@) { |
|---|
| 431 | warn $err; |
|---|
| 432 | } |
|---|
| 433 | } |
|---|
| 434 | |
|---|
| 435 | Encode::_utf8_off($text) if $to eq 'utf-8'; |
|---|
| 436 | $text; |
|---|
| 437 | } |
|---|
| 438 | |
|---|
| 439 | sub _conv_to_utf8 { |
|---|
| 440 | my $class = shift; |
|---|
| 441 | my ($text, $enc) = @_; |
|---|
| 442 | return $text if lc($enc) eq 'utf-8'; |
|---|
| 443 | $class->encode_text($text, $enc, 'utf-8'); |
|---|
| 444 | } |
|---|
| 445 | |
|---|
| 446 | sub _conv_from_utf8 { |
|---|
| 447 | my $class = shift; |
|---|
| 448 | my ($text, $enc) = @_; |
|---|
| 449 | return $text if lc($enc) eq 'utf-8'; |
|---|
| 450 | $class->encode_text($text, 'utf-8', $enc); |
|---|
| 451 | } |
|---|
| 452 | |
|---|
| 453 | sub decode_utf8_encode { |
|---|
| 454 | my $class = shift; |
|---|
| 455 | my ($text, $enc) = @_; |
|---|
| 456 | $text = $class->encode_text($text, $enc, 'utf-8'); |
|---|
| 457 | return Encode::decode_utf8($text); |
|---|
| 458 | } |
|---|
| 459 | |
|---|
| 460 | sub decode_utf8_perl { |
|---|
| 461 | my $class = shift; |
|---|
| 462 | my ($text, $enc) = @_; |
|---|
| 463 | $text = $class->encode_text($text, $enc, 'utf-8'); |
|---|
| 464 | return pack('U*', unpack('U0U*', $text)); |
|---|
| 465 | } |
|---|
| 466 | |
|---|
| 467 | sub utf8_off_encode { |
|---|
| 468 | my $class = shift; |
|---|
| 469 | my ($text) = @_; |
|---|
| 470 | Encode::_utf8_off($text); |
|---|
| 471 | $text; |
|---|
| 472 | } |
|---|
| 473 | |
|---|
| 474 | sub utf8_off_perl { |
|---|
| 475 | my $class = shift; |
|---|
| 476 | my ($text) = @_; |
|---|
| 477 | return pack('C*', unpack('C*', $text)); |
|---|
| 478 | } |
|---|
| 479 | |
|---|
| 480 | sub _load_module { |
|---|
| 481 | return $PKG if $PKG; |
|---|
| 482 | my $class = shift; |
|---|
| 483 | if ($] > 5.008) { |
|---|
| 484 | eval "require Encode"; |
|---|
| 485 | unless ($@) { |
|---|
| 486 | $PKG = 'encode'; |
|---|
| 487 | return $PKG; |
|---|
| 488 | } |
|---|
| 489 | } |
|---|
| 490 | $PKG = 'perl'; |
|---|
| 491 | return $PKG; |
|---|
| 492 | } |
|---|
| 493 | |
|---|
| 494 | 1; |
|---|