1========================================== 2 README for I18N Package 3========================================== 4 5o Name and location of package 6 7Name: php-3.0.18-i18n-ja-2 8Location: http://www.happysize.co.jp/techie/php-ja-jp/ 9 ftp://ftp.happysize.co.jp/php-ja-jp/ 10 http://php.vdomains.org/ 11 ftp://ftp.vdomains.org/pub/php-ja-jp/ 12 http://php.jpnnet.com/ 13 14Currently, this I18N version of PHP only adds Japanese support to base 15PHP. It allows you to use Japanese in scripts, as well as conversion 16between various Japanese encodings. It will work perfectly fine with 17ASCII with i18n option enabled. (note: executable is bit larger due 18to UNICODE table). The basic design aproach is to allow for other 19languages to be added in the future. Developers are encourage to join 20us! 21 22For more information on Japanese encodings, please refer to the 23section "Additional Notes." 24 25 26o What is this package? 27 28This package allows you to handle multiple Japanese encodings (SJIS, EUC, 29UTF-8, JIS) in PHP. If you find any bugs in this package, please report 30them to the appropriate mailing list. For now, the PHP-jp mailing list 31is the best place for this. 32 33PHP-jp ML mailto:PHP-jp@sidecar.ics.es.osaka-u.ac.jp 34 http://sidecar.ics.es.osaka-u.ac.jp/php-jp/ 35 (discussions are in Japanese) 36 37 38o Who should use this 39 40Due to lack of documentation, it's not intended for beginners. If 41something goes wrong, be prepared to fix it on your own. 42 43 44o Warranty and Copyright 45 46There is no warranty with this package. Use it at your own risk. 47 48Please refer to the source code for the copyrights. In general, each 49program's copyright is owned by the programmer. Unless you obey the 50copyright holders restrictions, you are not allowed to use it in any 51form. 52 53 54o Redistribution 55 56As described in the source code, this package and the components are 57allowed to be redistributed with certain restrictions. 58 59Due to this package being still in beta, please try to redistribute 60it as an entire package. Please try not to distribute it as a form 61of patch. Because we would prefer to have this package distributed 62as one single package (not patch of patch of patch), avoid releasing 63any patch to this package. 64 65 66o Who made this 67 68A team of volunteers, PHP3 Internationalization, has been contributing 69their free time producing it. Although we are not related to the core 70PHP programmers, we are hoping to have our modifications merged into the 71core distribution in the near future. Thus, we did not call this a 72"Japanese Patch" (or distribution). Our final goal is to have true 73i18nized PHP! 74 75For anyone interested in this project, please drop us a line. 76 77Contact Address: 78 phpj-dev@kage.net 79 (Discussions are in Japanese, but feel free to write us in English) 80 81Webpage (English and Japanese): 82 http://php.jpnnet.com/ 83 84Project Outline (Japanese): 85 http://www.happysize.co.jp/techie/php-ja-jp/spec.htm 86 87Developers: 88 Hironori Sato <satoh@jpnnet.com> 89 Shigeru Kanemoto <sgk@happysize.co.jp> 90 Tsukada Takuya <tsukada@fminn.nagano.nagano.jp> 91 U. Kenkichi <kenkichi@axes.co.jp> 92 Tateyama <tateyan@amy.hi-ho.ne.jp> 93 Other gracious contributors 94 95 96o Future plans 97 98- fulfilling what's written in outline 99- support for other languages other than Japanese 100- make the character conversion as a library (?) 101- more testing 102 103 104o Special Thanks to 105 106PHP Japanese webpage maintainer, Hirokawa-san 107 http://www.cityfujisawa.ne.jp/%7Elouis/apps/phpfi/ 108PHP-JP ML's Yamamoto-san 109 http://sidecar.ics.es.osaka-u.ac.jp/php-jp/ 110Previous jp-patch developers 111 112 113 114========================================== 115 Advantages of using I18N package 116========================================== 117 118- allows you to use various character encodings for script files and 119 http output 120- distinguish character encoding in POST/GET/COOKIE 121- proper mail output using JIS as body and MIME/Base64/JIS subject 122- if http output's Content-Type is text/html, it will set proper charset 123- stable character encoding conversion 124- multibyte regex 125 126 127 128========================================== 129 Installation 130========================================== 131 132o Summary 133 134Add --enable-i18n option when running configure. For your own setup, 135add any other appropriate options as well. 136 137Don't forget to copy php3.ini-dist to desired location. 138(ex. /usr/local/lib/php3.ini) 139 140If you have already installed PHP3, copy all the entries in php3.ini-dist 141which start with "i18n.xxxx" to php3.ini. 142 143 144o configure option 145 --enable-i18n 146 include i18n features 147 148 --enable-mbregex 149 include multibyte regex library 150 (without i18n enabled, mbregex functions will not function) 151 152 153o creating cgi version 154 155 % tar xvzf php-3.0.18-i18n-ja-2.tar.gz 156 % cd php-3.0.18-i18n-ja-2 157 % ./configure --enable-i18n --enable-mbregex 158 % make 159 160 161o creating Apache version (regular module) 162 163 % tar xvzf php-3.0.18-i18n-ja-2.tar.gz 164 % tar xvzf apache_1.3.x.tar.gz 165 % cd apache_1.3.x 166 % ./configure 167 % cd ../php-3.0.18-i18n-ja-2 168 % ./configure --with-apache=../apache_1.3.x --enable-i18n --enable-mbregex 169 % make 170 % make install 171 % cd ../apache_1.3.x 172 % ./configure --activate-module=src/modules/php3/libphp3.a 173 % make 174 % make install 175 176 177o creating Apache DSO version 178 179 create DSO capable Apache first 180 % tar xvzf apache_1.3.x.tar.gz 181 % cd apache-1.3.x 182 % ./configure --enable-shared=max 183 % make 184 % make install 185 186 now create php3 187 % cd php-3.0.18-i18n-ja-2 188 % ./configure --with-apxs=/usr/local/apache/bin/apxs --enable-i18n \ 189 --enable-mbregex 190 % make 191 % make install 192 193 194========================================== 195 Additional Notes 196========================================== 197 198o Multibyte regex library 199 200From beta4, we have included the multibyte (mb) regex library which comes with 201Ruby. With this addition, you can now use regex in EUC, SJIS and UTF-8 202encoding. To avoid any conflicts with HSREGEX included with Apache, 203each function name has been changed. Therefore, mb regex functions are 204named differently from the original ereg functions in PHP. The character 205encoding used in mb regex is configured in i18n.internal_encoding. 206 207 208o Binary Output 209 210If http output encoding is set to other than 'pass', conversion of encoding 211from internal encoding to http output is done automatically. Thus, 212if you prefer to spit out anything in raw binary format, your data 213may be corrupted. In such event, set http_output to 'pass'. 214 215ex. 216 <? 217 i18n_http_output("pass"); 218 ... 219 echo $the_binary_data_string; 220 ?> 221 222 223o Content-Type 224 225Depending on the setting of http_output, PHP will output the proper charset. 226ex. Content-Type: text/html; charset="..." 227 228Be aware of following: 229 230- If you set Content-Type header using header() function, that will 231 override the automatic addition of charset. 232- Be cautious when you set i18n_http_output, since if any output is 233 made prior to this, proper header may have been sent out to the 234 client already. 235 236 237o In the event of trouble 238 239If you find any bugs or trouble, please contact us at the above address. 240It may help us to track the problem if you send us the script as well. 241 242If you encounter any memory related error such as segmentation violation, 243add --enable-debug when you run configure. This will give you more 244detail information on where error has occurred. The error is stored 245in the server log or regular http output in CGI mode. 246 247 248o About Japanese encodings 249 250Due to historical reason, there are multiple character encodings used 251for Japanese. The most common encodings are: SJIS, EUC, JIS, and UTF-8. 252Here are (very) brief description of them: 253 254EUC 255 commonly used in UNIX environment 256 8bit-8bit combo 257 always >=0x80 258 259SJIS 260 commonly used in Mac or PCs 261 similar to EUC 262 mostly 8bit-8bit (some 8bit-7bit) 263 mostly >=0x80 264 there are some halfwidth (size of ASCII) multibytes 265 266JIS 267 commonly used in 7bit environment (nntp and smtp) 268 starts with escaping char, \033 and a few more characters 269 270UTF-8 271 16bit+ encoding 272 defines many languages existing in this world 273 see http://www.unicode.org/ for more detail 274 275Because of having all these character encodings, PHP needs to translate 276between these encodings on the fly. Also, the addition of the mb regex 277library allows you to handle mb strings without fear of getting mb char 278chopped in half. 279 280Since Japanese is not the only language with multiple encodings, we 281encourage other developers to modify our code to suit your needs. We 282definitely need people to work with Korean, Chinese (both traditional 283and simplified), and Russian. Let us know if you are interested in 284this project! 285 286 287 288========================================== 289 php3.ini setting 290========================================== 291 292The following init options will allow you to change the default settings. 293Define these settings in the global section of php3.ini. 294 295All keywords are case-insensitive. 296 297o Encoding naming 298 299 For each encoding, there are three names: standarized, alias, MIME 300 301 - UTF-8 302 standard: UTF-8 303 alias: N/A 304 mime: UTF-8 305 306 - ASCII 307 standard: ASCII 308 alias: N/A 309 mime: US-ASCII 310 311 - Japanese EUC 312 standard: EUC-JP 313 alias: EUC, EUC_JP, eucJP, x-euc-jp 314 mime: EUC-JP 315 316 - Shift JIS 317 standard: SJIS 318 alias: x-sjis, MS_Kanji 319 mime: Shift_JIS 320 321 - JIS 322 standard: JIS 323 alias: N/A 324 mime: ISO-2022-JP 325 326 - Quoted-Printable 327 standard: Quoted-Printable 328 alias: qprint 329 mime: N/A 330 331 - BASE64 332 standard: BASE64 333 alias: N/A 334 mime: N/A 335 336 - no conversion 337 standard: pass 338 alias: none 339 mime: N/A 340 341 - auto encoding detection 342 standard: auto 343 alias: unknown 344 mime: N/A 345 346 * N/A - Not Applicapable 347 348o i18n.http_output - default http output encoding 349 350 i18n.http_output = EUC-JP|SJIS|JIS|UTF-8|pass 351 EUC-JP : EUC 352 SJIS: SJIS 353 JIS : JIS 354 UTF-8: UTF-8 355 pass: no conversion 356 357 The default is pass (internal encoding is used) 358 It can be re-configured on the fly using i18n_http_output(). 359 360 361o i18n.internal_encoding - internal encoding 362 363 i18n.internal_encoding = EUC-JP|SJIS|UTF-8 364 EUC-JP : EUC 365 SJIS: SJIS 366 UTF-8: UTF-8 367 368 The default is EUC-JP. 369 370 PHP parser is designed based on using ISO-8859-1. For other 371 encodings, following conditions have to be satisfied in order 372 to use them: 373 - per byte encoding 374 - single byte charactor in range of 00h-7fh which is compatible 375 with ASCII 376 - multibyte without 00h-7fh 377 In case of Japanese, EUC-JP and UTF-8 are the only encoding that 378 meets this criteria. 379 380 If i18n.internal_encoding and i18n.http_output differs, conversion 381 takes place at the time of output. If you convert any data within 382 PHP scripts to URL encoding, BASE64 or Quoted-Printable, encoding 383 stays as defined in i18n.internal_encoding. Thus, if you would 384 prefer to encode in compliance with i18n.http_output, you need 385 to manually convert encoding. 386 387 ex. $str = urlencode( i18n_convert($str, i18n_http_output()) ); 388 389 Encoding such as ISO-2022-** and HZ encoding which uses escape 390 sequences can not be used as internal encoding. If used, they 391 result in following errors: 392 - parser pukes funky error 393 - magic_quotes_*** breaks encoding (SJIS may have similar problem) 394 - string manipulation and regex will malfunction 395 396 397o i18n.script_encoding - script encoding 398 399 i18n.script_encoding = auto|EUC-JP|SJIS|JIS|UTF-8 400 auto: automatic 401 EUC-JP : EUC 402 SJIS: SJIS 403 JIS : JIS 404 UTF-8: UTF-8 405 406 The default is auto. 407 The script's encoding is converted to i18n.internal_encoding before 408 entering the script parser. 409 410 Be aware that auto detection may fail under some conditions. 411 For best auto detection, add multibyte charactor at begining of 412 script. 413 414 415o i18n.http_input - handling of http input (GET/POST/COOKIE) 416 417 i18n.http_input = pass|auto 418 auto: auto conversion 419 pass: no conversion 420 421 The default is auto. 422 If set to pass, no conversion will take place. 423 If set to auto, it will automatically detect the encoding. If 424 detection is successful, it will convert to the proper internal 425 encoding. If not, it will assume the input as defined in 426 i18n.http_input_default. 427 428o i18n.http_input_default - default http input encoding 429 430 i18n.http_input_default = pass|EUC-JP|SJIS|JIS|UTF-8 431 pass: no conversion 432 EUC-JP : EUC 433 SJIS: SJIS 434 JIS : JIS 435 UTF-8: UTF-8 436 437 The default is pass. 438 This option is only effective as long as i18n.http_input is set to 439 auto. If the auto detection fails, this encoding is used as an 440 assumption to convert the http input to the internal encoding. 441 If set to pass, no conversion will take place. 442 443o sample settings 444 445 1) For most flexibility, we recommend using following example. 446 i18n.http_output = SJIS 447 i18n.internal_encoding = EUC-JP 448 i18n.script_encoding = auto 449 i18n.http_input = auto 450 i18n.http_input_default = SJIS 451 452 2) To avoid unexpected encoding problems, try these: 453 454 i18n.http_output = pass 455 i18n.internal_encoding = EUC-JP 456 i18n.script_encoding = pass 457 i18n.http_input = pass 458 i18n.http_input_default = pass 459 460 461 462========================================== 463 PHP functions 464========================================== 465 466The following describes the additional PHP functions. 467 468All keywords are case-insensitive. 469 470o i18n_http_output(encoding) 471o encoding = i18n_http_output() 472 473 This will set the http output encoding. Any output following this 474 function will be controlled by this function. If no argument is given, 475 the current http output encode setting is returned. 476 477 encodings 478 EUC-JP : EUC 479 SJIS: SJIS 480 JIS : JIS 481 UTF-8: UTF-8 482 pass: no conversion 483 484 NONE is not allowed 485 486 487o encoding = i18n_internal_encoding() 488 489 Returns the current internal encoding as a string. 490 491 internal encoding 492 EUC-JP : EUC 493 SJIS: SJIS 494 UTF-8: UTF-8 495 496 497o encoding = i18n_http_input() 498 499 Returns http input encoding. 500 501 encodings 502 EUC-JP : EUC 503 SJIS: SJIS 504 JIS : JIS 505 UTF-8: UTF-8 506 pass: no conversion (only if i18n.http_input is set to pass) 507 508 509o string = i18n_convert(string, encoding) 510 string = i18n_convert(string, encoding, pre-conversion-encoding) 511 512 Returns converted string in desired encoding. If 513 pre-conversion-encoding is not defined, the given 514 string is assumed to be in internal encoding. 515 516 encoding 517 EUC-JP : EUC 518 SJIS: SJIS 519 JIS : JIS 520 UTF-8: UTF-8 521 pass: no conversion 522 523 pre-conversion-encoding 524 EUC-JP : EUC 525 SJIS: SJIS 526 JIS : JIS 527 UTF-8: UTF-8 528 pass: no conversion 529 auto: auto detection 530 531 532o encoding = i18n_discover_encoding(string) 533 534 Encoding of the given string is returned (as a string). 535 536 encoding 537 EUC-JP : EUC 538 SJIS: SJIS 539 JIS : JIS 540 UTF-8: UTF-8 541 ASCII: ASCII (only 09h, 0Ah, 0Dh, 20h-7Eh) 542 pass: unable to determine (text is too short to determine) 543 unknown: unknown or possible error 544 545 546o int = mbstrlen(string) 547o int = mbstrlen(string, encoding) 548 549 Returns character length of a given string. If no encoding is defined, 550 the encoding of string is assumed to be the internal encoding. 551 552 encoding 553 EUC-JP : EUC 554 SJIS: SJIS 555 JIS : JIS 556 UTF-8: UTF-8 557 auto: automatic 558 559 560o int = mbstrpos(string1, string2) 561o int = mbstrpos(string1, string2, start) 562o int = mbstrpos(string1, string2, start, encoding) 563 564 Same as strpos. If no encoding is defined, the encoding of string 565 is assumed to be the internal encoding. 566 567 encoding 568 EUC-JP : EUC 569 SJIS: SJIS 570 JIS : JIS 571 UTF-8: UTF-8 572 573 574o int = mbstrrpos(string1, string2) 575o int = mbstrrpos(string1, string2, encoding) 576 577 Same as strrpos. If no encoding is defined, the encoding of string 578 is assumed to be the internal encoding. 579 580 encoding 581 EUC-JP : EUC 582 SJIS: SJIS 583 JIS : JIS 584 UTF-8: UTF-8 585 586 587o string = mbsubstr(string, position) 588o string = mbsubstr(string, position, length) 589o string = mbsubstr(string, position, length, encoding) 590 591 Same as substr. If no encoding is defined, the encoding of string 592 is assumed to be the internal encoding. 593 594 encoding 595 EUC-JP : EUC 596 SJIS: SJIS 597 JIS : JIS 598 UTF-8: UTF-8 599 600 601o string = mbstrcut(string, position) 602o string = mbstrcut(string, position, length) 603o string = mbstrcut(string, position, length, encoding) 604 605 Same as subcut. If position is the 2nd byte of a mb character, it will cut 606 from the first byte of that character. It will cut the string without 607 chopping a single byte from a mb character. In another words, if you 608 set length to 5, you will only get two mb characters. If no encoding 609 is defined, the encoding of string is assumed to be the internal encoding. 610 611 encoding 612 EUC-JP : EUC 613 SJIS: SJIS 614 JIS : JIS 615 UTF-8: UTF-8 616 617 618o string = i18n_mime_header_encode(string) 619 MIME encode the string in the format of =?ISO-2022-JP?B?[string]?=. 620 621 622o string = i18n_mime_header_decode(string) 623 MIME decodes the string. 624 625 626o string = i18n_ja_jp_hantozen(string) 627o string = i18n_ja_jp_hantozen(string, option) 628o string = i18n_ja_jp_hantozen(string, option, encoding) 629 630 Conversion between full width character and halfwidth character. 631 632 option 633 The following options are allowed. The default is "KV". 634 Acronym: FW = fullwidth, HW = halfwidth 635 636 "r" : FW alphabet -> HW alphabet 637 638 "R" : HW alphabet -> FW alphabet 639 640 "n" : FW number -> HW number 641 642 "N" : HW number -> FW number 643 644 "a" : FW alpha numeric (21h-7Eh) -> HW alpha numeric 645 646 "A" : HW alpha numeric (21h-7Eh) -> FW alpha numeric 647 648 "k" : FW katakana -> HW katakana 649 650 "K" : HW katakana -> FW katakana 651 652 "h" : FW hiragana -> HW hiragana 653 654 "H" : HW hiragana -> FW katakana 655 656 "c" : FW katakana -> FW hiragana 657 658 "C" : FW hiragana -> FW katakana 659 660 "V" : merge dakuon character. only works with "K" and "H" option 661 662 encoding 663 If no encoding is defined, the encoding of string is assumed to be 664 the internal encoding. 665 EUC-JP : EUC 666 SJIS: SJIS 667 JIS : JIS 668 UTF-8: UTF-8 669 670 671int = mbereg(regex_pattern, string, string) 672int = mberegi(regex_pattern, string, string) 673 mb version of ereg() and eregi() 674 675 676string = mbereg_replace(regex_pattern, string, string) 677string = mberegi_replace(regex_pattern, string, string) 678 mb version of ereg_replace() and eregi_replace() 679 680 681string_array = mbsplit(regex, string, limit) 682 mb version of split() 683 684 685 686========================================== 687 FAQ 688========================================== 689 690Here, we have gathered some commonly asked questions on PHP-jp mailing 691list. 692 693o To use Japanese in GET method 694 695If you need to assign Japanese text in GET method with argument, such as; 696xxxx.php?data=<Japanese text>, use urlencode function in PHP. If not, 697text may not be passed onto action php properly. 698 699ex: <a href="hoge.php?data=<? echo urlencode($data) ?>">Link</a> 700 701 702o When passing data via GET/POST/COOKIE, \ character sneaks in 703 704When using SJIS as internal encoding, or passed-on data includes '"\, 705PHP automatically inserts escaping character, \. Set magic_quotes_gpc 706in php3.ini from On to Off. An alternative work around to this problem 707is to use StripSlashes(). 708 709If $quote_str is in SJIS and you would like to extract Japanese text, 710use ereg_replace as follows: 711 712ereg_replace(sprintf("([%c-%c%c-%c]\\\\)\\\\",0x81,0x9f,0xe0,0xfc), 713 "\\1",$quote_str); 714 715This will effectively extract Japanese text out of $quote_str. 716 717 718o Sometimes, encoding detection fails 719 720If i18n_http_input() returns 'pass', it's likely that PHP failed to 721detect whether it's SJIS or EUC. In such case, use <input type=hidden 722value="some Japanese text"> to properly detect the incoming text's 723encoding. 724 725 726 727========================================== 728 Japanese Manual 729========================================== 730Translated manual done by "PHP Japanese Manual Project" : 731 732http://www.php.net/manual/ja/manual.php 733 734Starting 3.0.18-i18n-ja, we have removed doc-jp from tarball package. 735 736 737========================================== 738 Change Logs 739========================================== 740 741o 2000-10-28, Rui Hirokawa <hirokawa@php.net> 742 743This patch is derived from php-3.0.15-i18n-ja as well as php-3.0.16 by 744Kuwamura applied to original php-3.0.18. It also includes following fixes: 745 7461) allows you to set charset in mail(). 7472) fixed mbregex definitions to avoid conflicts with system regex 7483) php3.ini-dist now uses PASS for http_output instead of SJIS 749 750o 2000-11-24, Hironori Sato <satoh@yyplanet.com> 751 752Applied above patched and added detection for gdImageStringTTF in configure. 753Following setups are known to work: 754 755gd-1.3-6, gd-devel-1.3-6, freetype-1.3.1-5, freetype-devel-1.3.1-5 756 ImageTTFText($im,$size,$angle,$x1,$y1,$color,"/path/to/font.ttf", 757 i18n_convert("���ܸ�", "UTF-8")); 758 ImageGif($im); 759 760gd-1.7.3-1k1, gd-devel-1.7.3-1k1, freetype-1.3.1-5, freetype-devel-1.3.1-5 761 ImageTTFText($im,$size,$angle,$x1,$y1,$color,"/path/to/font.ttf","���ܸ�"); 762 ImagePng($im); 763 * i18n_internal_encoding = EUC ���� SJIS 764 765For any gd libraries before 1.6.2, you need to use i18n_convert. For 766gd-1.5.2/3, upgrade to anything above 1.7 to use ImageTTFText without 767using i18n_convert. As long as you have internal_encoding set to EUC or 768SJIS, ImageTTFText should work without mojibake. Again, make sure you 769have i18n_http_output("pass") before calling ImageGif, ImagePng, ImageJpeg! 770 771o 2000-12-09, Rui Hirokawa <hirokawa@php.net> 772 773Fixed mail() which was causing segmentation fault when header was null. 774 775