ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Java: РусскиС Π±ΡƒΠΊΠ²Ρ‹ ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎβ€¦

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ страницу Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡƒΠ΄ΠΎΠ±Π½ΠΎ (хотя Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎ). Для этого Π±Ρ‹Π»Π° Π²Π²Π΅Π΄Π΅Π½Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½Π° зависит ΠΎΡ‚ ΡΠΈΡΡ‚Π΅ΠΌΡ‹ ΠΈ Π΅Ρ‘ Π½Π°ΡΡ‚Ρ€ΠΎΠ΅ΠΊ (для русских Π²ΠΈΠ½Π΄ΠΎΠ² принята ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Cp1251), ΠΈ Π² ΡΡ‚Π°Ρ€Ρ‹Ρ… JDK Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ установкой систСмного свойства file.encoding. Π’ JDK 1.3 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этой настройки ΠΈΠ½ΠΎΠ³Π΄Π° срабатываСт, ΠΈΠ½ΠΎΠ³Π΄Π° — Π½Π΅Ρ‚. Π’Ρ‹Π·Π²Π°Π½ΠΎ это… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Java: РусскиС Π±ΡƒΠΊΠ²Ρ‹ ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎβ€¦ (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Java: РусскиС Π±ΡƒΠΊΠ²Ρ‹ ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ…

НСкоторыС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ слоТны, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠΌΠ½Ρ‹ΠΌ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ Π² ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ.

ЛорСнс Π”ΠΆ. ΠŸΠΈΡ‚Π΅Ρ€

Peter «s Almanac.

ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ

Когда я Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ C, ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΌΠΎΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ (Π½Π΅ ΡΡ‡ΠΈΡ‚ая HelloWorld) Π±Ρ‹Π»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ тСкстовых Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ Π“ΠžΠ‘Π’-Π° (ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΡƒΡŽ? :-) Π² Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ. Π‘Ρ‹Π»ΠΎ это Π² Π΄Π°Π»Ρ‘ΠΊΠΎΠΌ 1991;ΠΎΠΌ Π³ΠΎΠ΄Ρƒ. Π‘ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ измСнилось, Π½ΠΎ Π·Π° ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΠ΅ 10 Π»Π΅Ρ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΊΠΈ свою Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡŽ, Π½Π΅ ΠΏΠΎΡ‚Сряли. Блишком ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠΆΠ΅ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ… ΠΈ ΡΠ»ΠΈΡˆΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΎΠΉ. Для русского языка сущСствуСт Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ дСсятка Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½ΠΎΠΉ.

ΠžΡ‚ΠΊΡƒΠ΄Π° ΠΆΠ΅ взялись всС эти ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ Π΄Π»Ρ Ρ‡Π΅Π³ΠΎ ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹? ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹ ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Ρ‡ΠΈΡΠ»Π°ΠΌΠΈ. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π±ΡƒΠΊΠ²Ρ‹ Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π½Π°Π΄ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² ΡΠΎΠΎΡ‚вСтствиС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΡƒΠΊΠ²Π΅ Π½Π΅ΠΊΠΎΠ΅ число (ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ использовался ΠΈ Π΄ΠΎ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² — вспомнитС ΠΏΡ€ΠΎ Ρ‚Ρƒ ΠΆΠ΅ Π°Π·Π±ΡƒΠΊΡƒ ΠœΠΎΡ€Π·Π΅). ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ число ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ помСньшС — Ρ‡Π΅ΠΌ мСньшС Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… разрядов Π±ΡƒΠ΄Π΅Ρ‚ задСйствовано, Ρ‚Π΅ΠΌ эффСктивнСС ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’ΠΎΡ‚ это соотвСтствиС Π½Π°Π±ΠΎΡ€Π° символов ΠΈ Ρ‡ΠΈΡΠ΅Π» собствСнно ΠΈ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°. Π–Π΅Π»Π°Π½ΠΈΠ΅ любой Ρ†Π΅Π½ΠΎΠΉ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ‰Ρ‘Π½Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Ρ… Π³Ρ€ΡƒΠΏΠΏ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‰ΠΈΠΊΠΎΠ² ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΊ Π½Ρ‹Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ полоТСнию Π΄Π΅Π». Π‘Π°ΠΌΡ‹ΠΌ распространённым способом кодирования сСйчас являСтся использованиС для ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° (8 Π±ΠΈΡ‚), Ρ‡Ρ‚ΠΎ опрСдСляСт ΠΎΠ±Ρ‰Π΅Π΅ ΠΊΠΎΠ»-Π²ΠΎ символов Π² 256. Набор ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 128 символов стандартизован (Π½Π°Π±ΠΎΡ€ ASCII) ΠΈ ΡΠ²Π»ΡΠ΅Ρ‚ся ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ Π²ΠΎ Π²ΡΠ΅Ρ… распространённых ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ… (Ρ‚Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π³Π΄Π΅ это Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆΠ΅ практичСски Π²Ρ‹ΡˆΠ»ΠΈ ΠΈΠ· ΡƒΠΏΠΎΡ‚рСблСния). АнглицкиС Π±ΡƒΠΊΠΎΠ²ΠΊΠΈ ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Ρ‹ ΠΏΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΠΈ находятся Π² ΡΡ‚ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ ΠΈΡ… ΠΏΠΎΡ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΆΠΈΠ²ΡƒΡ‡Π΅ΡΡ‚ΡŒ Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… систСмах :-). Π”Ρ€ΡƒΠ³ΠΈΠ΅ языки находятся Π½Π΅ Π² ΡΡ‚ΠΎΠ»ΡŒ счастливом ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ — ΠΈΠΌ Π²ΡΠ΅ΠΌ приходится ΡŽΡ‚ΠΈΡ‚ΡŒΡΡ Π² ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ 128 числах.

Unicode

Π’ ΠΊΠΎΠ½Ρ†Π΅ 80-Ρ… ΠΌΠ½ΠΎΠ³ΠΈΠ΅ осознали Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ создания Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ стандарта Π½Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ символов, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡŽ Unicode. Unicode — это ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Ρ€Π°Π· ΠΈ Π½Π°Π²ΡΠ΅Π³Π΄Π° Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ число Π·Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ символом. ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² 256 символов Ρ‚ΡƒΡ‚ Π½Π΅ ΡƒΠ»ΠΎΠΆΠΈΡˆΡŒΡΡ ΠΏΡ€ΠΈ всём ΠΆΠ΅Π»Π°Π½ΠΈΠΈ. Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя казалось, Ρ‡Ρ‚ΠΎ ΡƒΠΆ 2-Ρ… Ρ‚ΠΎ Π±Π°ΠΉΡ‚ (65 536 символов) Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ. Ан Π½Π΅Ρ‚ — послСдняя вСрсия стандарта Unicode (3.1) опрСдСляСт ΡƒΠΆΠ΅ 94 140 символов. Для Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ»-Π²Π° символов, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, ΡƒΠΆΠ΅ придётся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 4 Π±Π°ΠΉΡ‚Π° (4 294 967 296 символов). ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Ρ…Π²Π°Ρ‚ΠΈΡ‚ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя… :-).

Π’ Π½Π°Π±ΠΎΡ€ символов Unicode входят всСвозмоТныС Π±ΡƒΠΊΠ²Ρ‹ со Π²ΡΡΠΊΠΈΠΌΠΈ Ρ‡Ρ‘Ρ€Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΡ€ΠΈΠΏΠ΅Π½Π΄ΡŽΠ»ΡŒΠΊΠ°ΠΌΠΈ, грСчСскиС, матСматичСскиС, ΠΈΠ΅Ρ€ΠΎΠ³Π»ΠΈΡ„Ρ‹, символы псСвдографики ΠΈ ΠΏΡ€. ΠΈ ΠΏΡ€. Π’ Ρ‚ΠΎΠΌ числС ΠΈ Ρ‚Π°ΠΊ Π»ΡŽΠ±ΠΈΠΌΡ‹Π΅ Π½Π°ΠΌΠΈ символы ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Ρ‹ (Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ 0×0400−0×04ff). Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ с ΡΡ‚ΠΎΠΉ стороны Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ дискриминации Π½Π΅Ρ‚.

Если Π’Π°ΠΌ интСрСсны ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΊΠΎΠ΄Π° символов, для ΠΈΡ… ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π° ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ «Π’Π°Π±Π»ΠΈΡ†Π° символов «ΠΈΠ· WinNT. Π’ΠΎΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Ρ‹:

.

Если Ρƒ Π’ас другая OS ΠΈΠ»ΠΈ Вас интСрСсуСт ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΡƒΡŽ раскладку символов (charts) ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ сайтС Unicode (internet.

Π’ΠΈΠΏΡ‹ char ΠΈ byte

Π’ Java для символов Π²Ρ‹Π΄Π΅Π»Π΅Π½ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… char Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π² 2 Π±Π°ΠΉΡ‚Π°. Π­Ρ‚ΠΎ часто ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρƒ Π² ΡƒΠΌΠ°Ρ… Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… (особСнно Ссли ΠΎΠ½ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° C/C++). Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… языков для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ символов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π² 1 Π±Π°ΠΉΡ‚. НапримСр, Π² C/C++ Ρ‚ΠΈΠΏ char Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ символов, Ρ‚Π°ΠΊ ΠΈ Π΄Π»Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π±Π°ΠΉΡ‚ΠΎΠ² — Ρ‚Π°ΠΌ Π½Π΅Ρ‚ раздСлСния. Π’ Java для Π±Π°ΠΉΡ‚ΠΎΠ² имССтся свой Ρ‚ΠΈΠΏ — Ρ‚ΠΈΠΏ byte. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ C-ΠΈΡˆΠ½ΠΎΠΌΡƒ char соотвСтствуСт Java-вский byte, Π° Java-вскому char ΠΈΠ· ΠΌΠΈΡ€Π° C Π±Π»ΠΈΠΆΠ΅ всСго Ρ‚ΠΈΠΏ wchar_t. Надо Ρ‡Ρ‘Ρ‚ΠΊΠΎ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ понятия символов ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ² — ΠΈΠ½Π°Ρ‡Π΅ Π½Π΅ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹.

Java практичСски с ΡΠ°ΠΌΠΎΠ³ΠΎ своСго роТдСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для кодирования символов стандарт Unicode. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Java ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° char символы, прСдставлСнныС ΠΊΠΎΠ΄Π°ΠΌΠΈ Unicode. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, Π’Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΠΈΡ…Π½ΡƒΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ — Ρ†ΠΈΡ„Ρ€Ρ‹ Π΅ΡΡ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹, процСссор всё стСрпит, Π½ΠΎ ΠΏΡ€ΠΈ любой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ исходя ΠΈΠ· ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ‡Ρ‚ΠΎ ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ Unicode. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ спокойно ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ Ρ‚ΠΈΠΏΠ° char ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° зафиксирована. Но ΡΡ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ JVM. Когда Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ·Π²Π½Π΅ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π½Π°Ρ€ΡƒΠΆΡƒ, Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ — Ρ‚ΠΈΠΏΠΎΠΌ byte. ВсС ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ· Π±Π°ΠΉΡ‚ΠΎΠ² Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎΡ‚ Ρ‚ΡƒΡ‚ Ρ‚ΠΎ Π½Π° ΡΡ†Π΅Π½Ρƒ ΠΈ Π²Ρ‹Ρ…одят ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ — Π² Java это просто Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ символов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для формирования Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° char. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ страницы Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ имССтся ΠΏΠΎ 2 класса ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ (ByteToChar ΠΈ CharToByte). ΠšΠ»Π°ΡΡΡ‹ эти Π»Π΅ΠΆΠ°Ρ‚ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ sun.io. Если, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ ΠΈΠ· char Π² byte Π½Π΅ Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ символа, ΠΎΠ½ Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ‚ся Π½Π° ΡΠΈΠΌΠ²ΠΎΠ» ?.

ΠšΡΡ‚Π°Ρ‚ΠΈ, эти Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Ρ… страниц Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π½Π½ΠΈΡ… вСрсиях JDK 1.1 содСрТат ошибки, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ошибки ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ, Π° Ρ‚ΠΎ ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ. НапримСр, это касаСтся ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ KOI8_R. Π›ΡƒΡ‡ΡˆΠ΅Π΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈ этом ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ — ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ Π½Π° Π±ΠΎΠ»Π΅Π΅ позднюю. Будя ΠΏΠΎ Sun-овскому описанию, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π² Π²Π΅Ρ€ΡΠΈΠΈ JDK 1.1.6.

Π”ΠΎ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ вСрсии JDK 1.4 Π½Π°Π±ΠΎΡ€ доступных ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ опрСдСлялся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ JDK. Начиная с 1.4 появилось Π½ΠΎΠ²ΠΎΠ΅ API (ΠΏΠ°ΠΊΠ΅Ρ‚ java.nio.charset), ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π’Ρ‹ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ, Π½ΠΎ ΠΆΡƒΡ‚ΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠΌΠ΅Π½Π½ΠΎ Π’Π°ΠΌ).

Класс String

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв для прСдставлСния строк Π² Java ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° java.lang.String. Π­Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя Ρ…Ρ€Π°Π½ΠΈΡ‚ массив символов (char[]), ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для манипуляции символами. Π‘Π°ΠΌΡ‹Π΅ интСрСсныС — это конструкторы, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ массив Π±Π°ΠΉΡ‚ΠΎΠ² (byte[]) ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ getBytes (). ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ прСобразования ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° Π±Π°ΠΉΡ‚ΠΎΠ² Π² ΡΡ‚Ρ€ΠΎΠΊΠΈ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΡ€ΠΈ этом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρƒ ΡΡ‚ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π΅ΡΡ‚ΡŒ строковый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π΄Π°Ρ‘Ρ‚ Π΅Ρ‘ ΠΈΠΌΡ. Π’ΠΎΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈΠ· ΠšΠžΠ˜-8 Π² Windows-1251:

// Π”Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ КОИ-8.

byte[] koi8Data = …;

// ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ ΠΈΠ· ΠšΠžΠ˜-8 Π² Unicode.

String string = new String (koi8Data, «KOI8_R »);

// ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ ΠΈΠ· Unicode Π² Windows-1251.

byte[] winData = string. getBytes («Cp1251 »);

Бписок 8-ΠΌΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ, доступных Π² ΡΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… JDK ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… русскиС Π±ΡƒΠΊΠ²Ρ‹ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π½ΠΈΠΆΠ΅, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ «8-ΠΌΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ русских Π±ΡƒΠΊΠ² » .

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° — это Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… для символов, ΠΊΡ€ΠΎΠΌΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹Ρ… 8-ΠΌΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ Π² Java Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° Ρ€Π°Π²Π½Ρ‹Ρ… ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ. К Ρ‚Π°ΠΊΠΈΠΌ относятся UTF-8, UTF-16, Unicode ΠΈ ΠΏΡ€. ΠΠ°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π°ΠΉΡ‚Ρ‹ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ UnicodeLittleUnmarked (16-Ρ‚ΠΈ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Unicode, младший Π±Π°ΠΉΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, Π±Π΅Π· ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ° порядка Π±Π°ΠΉΡ‚ΠΎΠ²):

// Π‘Ρ‚Ρ€ΠΎΠΊΠ° Unicode.

String string = «… » ;

// ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ ΠΈΠ· Unicode Π² UnicodeLittleUnmarked.

byte[] data = string. getBytes («UnicodeLittleUnmarked »);

ΠŸΡ€ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… прСобразованиях Π»Π΅Π³ΠΊΠΎ ΠΎΡˆΠΈΠ±ΠΈΡ‚ΡŒΡΡ — Ссли ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ ΠΏΡ€ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ· byte Π² char, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Иногда послС этого ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‚Π°Ρ‰ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ символы, Π½ΠΎ Ρ‡Π°Ρ‰Π΅ всСго Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Π±Π΅Π·Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½ΠΎ потСряна.

Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ страницу Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡƒΠ΄ΠΎΠ±Π½ΠΎ (хотя Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎ). Для этого Π±Ρ‹Π»Π° Π²Π²Π΅Π΄Π΅Π½Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½Π° зависит ΠΎΡ‚ ΡΠΈΡΡ‚Π΅ΠΌΡ‹ ΠΈ Π΅Ρ‘ Π½Π°ΡΡ‚Ρ€ΠΎΠ΅ΠΊ (для русских Π²ΠΈΠ½Π΄ΠΎΠ² принята ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Cp1251), ΠΈ Π² ΡΡ‚Π°Ρ€Ρ‹Ρ… JDK Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ установкой систСмного свойства file.encoding. Π’ JDK 1.3 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этой настройки ΠΈΠ½ΠΎΠ³Π΄Π° срабатываСт, ΠΈΠ½ΠΎΠ³Π΄Π° — Π½Π΅Ρ‚. Π’Ρ‹Π·Π²Π°Π½ΠΎ это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ: ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ file. encoding ставится ΠΏΠΎ Ρ€Π΅Π³ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ настройкам ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Бсылка Π½Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ запоминаСтся Π² Π½ΡƒΡ‚рях ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ. ΠŸΡ€ΠΈ этом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ file. encoding, Π½ΠΎ ΡΡ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ происходит Π΅Ρ‰Ρ‘ Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² запуска JVM (собсно, ΠΏΡ€ΠΈ ΠΈΡ… Ρ€Π°Π·Π±ΠΎΡ€Π΅). Π’ΠΎΠΎΠ±Ρ‰Π΅-Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚ Π² Sun, это свойство ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ, ΠΈ ΠΎΠ½Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС (см., Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΊ BugID 4 163 515) Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π² JDK 1.4 Beta 2 смСна этой настройки ΠΎΠΏΡΡ‚ΡŒ Π½Π°Ρ‡Π°Π»Π° ΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ эффСкт. Π§Ρ‚ΠΎ это, ΡΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡΡ‚ΡŒ ΠΈΡΡ‡Π΅Π·Π½ΡƒΡ‚ΡŒ — Sun-ΠΎΠ²Ρ†Ρ‹ ясного ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΏΠΎΠΊΠ° Π½Π΅ Π΄Π°Π»ΠΈ.

Π­Ρ‚Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° явно Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ страницы. Об ΡΡ‚ΠΎΠΌ Π½Π°Π΄ΠΎ всСгда ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ — Java Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ Π±Π°ΠΉΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π’Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚Π΅ для создания строки String (Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΎΠ½Π° Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π’Π°ΡˆΠΈ мысли ΠΏΠΎ ΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ :-). Она просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’.ΠΊ. эта настройка ΠΎΠ΄Π½Π° Π½Π° Π²ΡΠ΅ прСобразования, ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‚ΠΊΠ½ΡƒΡ‚ΡŒΡΡ Π½Π° Π½Π΅ΠΏΡ€ΠΈΡΡ‚ности.

Для прСобразования ΠΈΠ· Π±Π°ΠΉΡ‚ΠΎΠ² Π² ΡΠΈΠΌΠ²ΠΎΠ»Ρ‹ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ слСдуСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ. ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв нСльзя — ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° символов ΠΏΡ€ΠΈ этом Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ. НапримСр, ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΠΌΡ‹Ρ… распространённых ошибок являСтся Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ±Π°ΠΉΡ‚Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° read () ΠΈΠ· InputStream, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ значСния ΠΊ Ρ‚ΠΈΠΏΡƒ char:

InputStream is = .;

int b;

StringBuffer sb = new StringBuffer ();

while ((b=is.read ())≠-1).

{.

sb. append ((char)b); //.

Если ΠΆΠ΅ Π’Π°ΠΌ Π½Π΅ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ, ΠΈ Ρƒ Π’ас Π±ΠΎΠ»Π΅Π΅ старая вСрсия — для достиТСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° придётся ΠΏΠΎΠΈΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ:

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ способ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Russian Apache — здСсь расписано, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ.

Π‘Π²ΠΎΡ‘ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» ВячСслав ПСдак.

Ну, Π° ΡΠ°ΠΌΡ‹ΠΉ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Ρ‚Π°ΠΊΠΈ символы — ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² имя ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ (ΠΈΠ»ΠΈ, Ссли Π²Ρ‹ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ Π±Ρ€ΠΎΡƒΠ·Π΅Ρ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ) ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ символов:

public void doPost (HttpServletRequest request, HttpServletResponse response).

throws ServletException, IOException.

{.

// ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° сообщСний, использованная engine.

// НСкоторыС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ISO-8859−1, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ.

// ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ — Сдинообразия Ρ‚ΡƒΡ‚ Π½Π΅Ρ‚.

String requestEnc = «ISO-8859−1 » ;

// ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°, установлСнная Π² Π±Ρ€ΠΎΡƒΠ·Π΅Ρ€Π΅.

String clientEnc = request. getParameter («charset »);

if (clientEnc==null) clientEnc= «Cp1251 » ;

// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

String value = request. getParameter («value »);

//.

if (value≠null).

value = new String (value.getBytes (requestEnc), clientEnc);

JSP.

ВСхнология JSP (Java Server Pages) ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΡΠ΅Ρ€Π²Π»Π΅Ρ‚Ρ‹. По ΡΡƒΡ‚ΠΈ Π΄Π΅Π»Π° сСрвСр, ΠΏΡ€ΠΈ запросС Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· Π½Π° Π»Π΅Ρ‚Ρƒ Π³Π΅Π½Π΅Ρ€ΠΈΡ‚ ΠΈΠ· jsp-страниц ΠΊΠΎΠ΄ сСрвлСта, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ сСрвлСт. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρƒ JSP Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ схоТиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ€ΡƒΡΡΠΊΠΈΠΌΠΈ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ. Однако Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. Π•ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ мСста Π³Π΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ трудности — русскиС Π±ΡƒΠΊΠ²Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ самой jsp-страницы, Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΈ Π² Π·Π°ΠΏΡ€ΠΎΡΠ΅ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ Π·Π°Π΄Π°Π½ΠΈΠ΅ΠΌ Π² Π½Π°Ρ‡Π°Π»Π΅ страницы Ρ‚Π΅Π³Π° page:

Π£Π²ΠΈΠ΄Π΅Π² эту Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ сСрвСр ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ страница записана Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅, ΠΈ Ρ‡Ρ‚ΠΎ Π² ΡΠ³Π΅Π½Π΅Ρ€Ρ‘Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² response. setContentType () с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ contentType. Если сСрвСр ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ Servlet 2.3, Ρ‚ΠΎ ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ ΠΈ Π²Ρ‹Π·ΠΎΠ² request. setCharacterEncoding () с Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠΌ Ρ€Π΅ΡˆΠ°Ρ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Для Π±ΠΎΠ»Π΅Π΅ старых сСрвСров для раскодирования ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Π·Π°ΠΏΡ€ΠΎΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π°Π΄ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ухищрСния, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ описанным Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΠΎ ΡΠ΅Ρ€Π²Π»Π΅Ρ‚Π°ΠΌ.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ JSP-Ρ„ΠΎΡ€ΡƒΠΌ Jive для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€ΡƒΡΡΠΊΠΈΠΌΠΈ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ Π½Π°Π΄ΠΎ ΠΎΡ‚ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹:

/jive/header.jsp.

/jive/admin/header.jsp.

Π’ Π½ΠΈΡ… Π½Π°Π΄ΠΎ Π² Π½Π°Ρ‡Π°Π»ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ строчку.

ВмСсто UTF-8 ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ русскиС Π±ΡƒΠΊΠ²Ρ‹ — всё зависит ΠΎΡ‚ Π²ΠΊΡƒΡΠΎΠ² ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΡΡ‚ΠΎΠΌ прислал АлСксСй Π•ΠΏΠΈΡˆΠΊΠΈΠ½, Π·Π° Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ спасибо.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сСрвСрах Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π±Π°Π³ΠΈ, связанныС с Ρ€ΡƒΡΡΠΊΠΈΠΌΠΈ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ Π² JSP. НапримСр, сСрвСр Orion Π½Π΅ Π»ΡŽΠ±ΠΈΡ‚ Ρ€ΡƒΡΡΠΊΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ «Π’ «- ΠΎΠ½ Π²ΠΌΠ΅ΡΡ‚ΠΎ Π½Π΅Ρ‘ Π² ΡΠ³Π΅Π½Π΅Ρ€Ρ‘Π½Π½Ρ‹ΠΉ сСрвлСт подставляСт символ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. Π’Π°ΠΌ Π²ΠΎ Π²Π½ΡƒΡ‚рСнностях Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:

switch (charstring.c1(i)).

public final char c1(int i).

{.

if (i < 0 || i >= length).

throw new StringIndexOutOfBoundsException (i);

else.

return (char)(data[offset + i] & 0xff);

data — это массив Ρ‚ΠΈΠΏΠ° char[]. Как Π²ΠΈΠ΄Π½ΠΎ, ошибка Ρ‚ΡƒΡ‚ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π° — Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Π±Ρ‹Π» ΡƒΠ²Π΅Ρ€Π΅Π½ Ρ‡Ρ‚ΠΎ символы с ΠΊΠΎΠ΄Π°ΠΌΠΈ большС 255 — это ошибка ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρ‹. :-).

JavaMail.

ΠŸΠ°ΠΊΠ΅Ρ‚ JavaMail ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΠ»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΌΠΈ письмами. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ этого ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ письма Ρ‡Π΅Ρ€Π΅Π· Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹. Π Π°Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ символы. Π‘Π°ΠΌΡ‹Π΅ распространённыС Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ Internet основаны Π½Π° ΡΡ‚Π°Ρ€ΠΎΠΌ стандартС RFC-822. Богласно этому стандарту Π² ΡΠ»ΡƒΠΆΠ΅Π±Π½Ρ‹Ρ… полях (Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ…) писСм Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ символы ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ ASCII, Ρ‚. Π΅. Ρ‚ΠΎΠ»ΡŒΠΊΠΎ латинскиС Π±ΡƒΠΊΠ²Ρ‹ (ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 128 символов Unicode). ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ это Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ρ‚.ΠΊ. часто ΠΎΡ‡Π΅Π½ΡŒ хочСтся ΠΏΠΈΡΠ°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΏΠΎΠ»Π΅ Subject (Ρ‚Π΅ΠΌΠ° письма) ΠΈΠ»ΠΈ Π² ΠΏΠΎΠ»ΡΡ… From/To (имя ΠΈ Π°Π΄Ρ€Π΅Ρ отправитСля/получатСля) русский тСкст. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π±Ρ‹Π» ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ стандарт кодирования MIME (RFC 2047). Он ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… полях Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° (Π½Π΅ Π²ΠΎ Π²ΡΠ΅Ρ…) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ символы ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ кодирования (Base64 ΠΈΠ»ΠΈ QuotedPrintable).

Для прСдставлСния писСм Π² JavaMail ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс javax.mail.Message. Π­Ρ‚ΠΎ абстрактный класс, Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΆΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ опрСдСляСтся наслСдниками. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Π² Π½Ρ‘ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ Java-строками (String). Для ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² Internet ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ наслСдник javax.mail.internet.MimeMessage, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΈΠΌΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² добавляСт ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для писСм. Для кодирования ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс javax.mail.internet.MimeUtility. Класс MimeMessage ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ сам обращаСтся ΠΊ Π½Π΅ΠΌΡƒ для кодирования/раскодирования Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², Π½ΠΎ, Ссли Π’Ρ‹ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌ (ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ getHeader ()/setHeader ()/addHeader ()), Ρ‚ΠΎ Π΄Π»Ρ ΠΈΡ… ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ/раскодирования Π’Π°ΠΌ придётся ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ MimeUtility самому.

Если Π’Ρ‹ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ письма, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ использована ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ — ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ file. encoding, Π½ΠΎ Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ систСмной настройкой «mail.mime.charset ». Π­Ρ‚ΠΎ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ, Ρ‚.ΠΊ. часто ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² ΡΠΈΡΡ‚Π΅ΠΌΠ΅ отличаСтся ΠΎΡ‚ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ Internet. Для русскоязычных писСм Π² Internet стандартом Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎ стала ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° КОИ-8. Π’Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ, Π½ΠΎ ΡˆΠ°Π½Ρ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ сторона Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ письмо ΠΎΡ‡Π΅Π½ΡŒ Π²Π΅Π»ΠΈΠΊ.

Надо ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π² JavaMail Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π΄Π²Π° стандарта наимСнования ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ — стандарт MIME ΠΈ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚ Java. Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈΠΌΠ΅Π½Π° MIME ΡƒΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Java ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° синонимов. НапримСр, для ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ «Cp1251 «(Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Java) сущСствуСт синоним «Windows-1251 «(Π½Π°Π·Π²Π°Π½ΠΈΠ΅ MIME). Для Ρ‚Π΅Ρ… ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚Π°ΠΊΠΈΠ΅ синонимы ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚, ΠΎΠ½ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ JavaMail. Для этого загруТаСтся Ρ„Π°ΠΉΠ» javamail.charset.map ΠΈΠ· ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° «/META-INF «ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ jar-Ρ„Π°ΠΉΠ»Π°, ΠΎΡ‚ΠΊΡƒΠ΄Π° Π±Ρ‹Π» Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ ΠΏΠ°ΠΊΠ΅Ρ‚ JavaMail. Для указания ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² JavaMail слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ MIME-ΠΈΠΌΠ΅Π½Π°, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ (Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΊΠΎΠ½Ρ†Π΅ Π½Π΅ Ρ‚ΠΎΠΆΠ΅ Java :-).

Π’ΠΎΡ‚ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ письма ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ JavaMail:

import java.util.Properties;

import javax.mail.Session;

import javax.mail.Message;

import javax.mail.Transport;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.InternetAddress;

public class MailTest.

{.

static final String ENCODING = «koi8-r » ;

static final String FROM = «myaccount@mydomail.ru » ;

static final String TO = «myaccount@mydomail.ru » ;

public static void main (String args[]) throws Exception.

{.

Properties mailProps = new Properties ();

mailProps. put («mail.store.protocol », «pop3 »);

mailProps. put («mail.transport.protocol », «smtp »);

mailProps. put («mail.user », «myaccount »);

mailProps. put («mail.pop3.host », «mail.mydomail.ru »);

mailProps. put («mail.smtp.host », «mail.mydomail.ru »);

Session session = Session. getDefaultInstance (mailProps);

MimeMessage message = new MimeMessage (session);

message. setFrom (new InternetAddress (FROM));

message. setRecipient (Message.RecipientType.TO, new InternetAddress (TO));

message. setSubject («Π’СстовоС письмо », ENCODING);

message. setText («Π’Скст тСстового письма », ENCODING);

Transport. send (message);

}.

}.

XML/XSL.

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° XML особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡƒΠ΄Π΅Π»ΡΠ»ΠΎΡΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ символов. Для указания Ρ‚ΠΎΠ³ΠΎ, какая ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Π±Ρ‹Π»Π° использована ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

Если ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ΡƒΠΊΠ°Π·Π°Π½Π° Π½Π΅ Π±Ρ‹Π»Π°, Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ прСдполагаСтся ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° UTF-8. На XML-парсСр Π²ΠΎΠ·Π»ΠΎΠΆΠ΅Π½Π° ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ для получСния Unicode-символов. Π Π°Π·Π½Ρ‹Π΅ парсСры ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π½Π°Π±ΠΎΡ€Ρ‹ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ, Π½ΠΎ UTF-8 обязаны ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ всС. Π—Π΄Π΅ΡΡŒ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² ΡΠ»ΡƒΡ‡Π°Π΅ с JavaMail наимСнования ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ, описанныС Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π΅ XML ΠΌΠΎΠ³ΡƒΡ‚ расходится с Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ, принятыми Π² Java. Π Π°Π·Π½Ρ‹Π΅ парсСры ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ выходят ΠΈΠ· ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Crimson просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΊΠΎΠ»-Π²ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… синонимов, Π° Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ полагаСтся Π½Π° ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΡ‹ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈΠ· Java. Xerces ΠΆΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ (класс org.apache.xerces.readers.MIME2Java), Π° Π΅ΡΠ»ΠΈ Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚Π°ΠΌ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ, Ρ‚ΠΎ Π±Ρ€ΠΎΡΠ°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎ Π½Π΅ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅. Π’ Xerces вСрсии 1.4.0 русских ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ Ρ‚Π°ΠΌ всСго Π΄Π²Π΅ — KOI8-R ΠΈ ISO-8859−5. Однако это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρƒ ΠΏΠ°Ρ€ΡΠ΅Ρ€Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ feature «internet Если этот feature Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½ (ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° setFeature ()), Ρ‚ΠΎ ΠΏΠ°Ρ€ΡΠ΅Ρ€ послС поиска Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартный Java-вский ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΈ ΡΠΎΠΎΡ‚вСтствСнно Java-вский Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ. Π’ ΡΠ»ΡƒΡ‡Π°Π΅ использования интСрфСйса SAX ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (ΠΏΡ€ΠΈ использовании JAXP):

SAXParserFactory parserFactory = SAXParserFactory. newInstance ();

SAXParser parser = parserFactory. newSAXParser ();

parser.getXMLReader ().setFeature («internet.

Для DOM, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡŽ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° feature-ΠΎΠ² Π½Π΅ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΎ, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ вмСсто JAXP для создания DOM Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс org.apache.xerces.parsers.DOMParser, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ setFeature ().

Если ΠΆΠ΅ Xerces ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π° ΠΏΠΎΡΡ€Π΅Π΄ΡΡ‚Π²ΠΎΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ этот ΠΏΠ°ΠΊΠ΅Ρ‚ Π΄Π°Π±Ρ‹ ΠΎΠ½ ΡΠ°ΠΌ выставлял этот feature. Если ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠΉ возмоТности Π½Π΅ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΎ, Ρ‚ΠΎ ΠΎΡΡ‚аётся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Ρ…ΠΎΠ΄ — ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ€ΡƒΡ‡ΠΊΠ°ΠΌΠΈ. Для этого ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ список ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ Π² ΠΊΠ»Π°ΡΡΠ΅ org.apache.xerces.readers.MIME2Java ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ feature ΠΊΠ°ΠΊ true ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Для чтСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс org.xml.sax.InputSource. БобствСнно сам ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСн ΠΈΠ»ΠΈ Π² Π²ΠΈΠ΄Π΅ Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° (java.io.InputStream) ΠΈΠ»ΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° символов (java.io.Reader). БоотвСтствСнно ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ распознаваниС ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ возлагаСтся ΠΈΠ»ΠΈ Π½Π° ΠΏΠ°Ρ€ΡΠ΅Ρ€ ΠΈΠ»ΠΈ Π½Π° Ρ‚ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ создаёт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Reader. Π£ ΠΊΠ»Π°ΡΡΠ° InputSource Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ setEncoding (), ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ явно Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ Π² ΡΠ»ΡƒΡ‡Π°Π΅ использования ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ².

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ это всё Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Если Π±Ρ‹Π» Π·Π°Π΄Π°Π½ ΠΏΠΎΡ‚ΠΎΠΊ символов (Reader), Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ использован для чтСния Π΄Π°Π½Π½Ρ‹Ρ…. ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°, установлСнная ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ setEncoding () ΠΏΡ€ΠΈ этом игнорируСтся, ΠΊΠ°ΠΊ игнорируСтся ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°, указанная Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°.

Если вмСсто ΠΏΠΎΡ‚ΠΎΠΊΠ° символов Π±Ρ‹Π» Π·Π°Π΄Π°Π½ ΠΏΠΎΡ‚ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ² (InputStream), Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ся ΠΎΠ½. Если установлСна ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ setEncoding (), Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ся ΠΎΠ½Π°, Π° Π΅ΡΠ»ΠΈ Π½Π΅Ρ‚ — Ρ‚ΠΎ ΠΏΠ°Ρ€ΡΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ, ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°.

Если ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° обнаруТиваСтся расхоТдСниС ΠΌΠ΅ΠΆΠ΄Ρƒ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, Ρ‚ΠΎ ΠΏΠ°Ρ€ΡΠ΅Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ. Crimson, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ этом Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Π° Xerces ΠΌΠΎΠ»Ρ‡Π° пропускаСт.

Π‘ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ ΠΊ ΠΈΡ… ΡΠΎΠ·Π΄Π°Π½ΠΈΡŽ. Π•Π΄ΠΈΠ½ΠΎΠ³ΠΎ стандарта Π½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΈ ΠΎΡ‚ Ρ‡Ρ‚Сния, ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ вСрсия Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚Π° W3C Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² ΡΠ΅Π±Ρ ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½ΠΎ ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ создатСли парсСров Π΄Π΅Π»Π°ΡŽΡ‚ ΠΊΡ‚ΠΎ Π²ΠΎ Ρ‡Ρ‚ΠΎ Π³ΠΎΡ€Π°Π·Π΄.

Π’ ΡΠ»ΡƒΡ‡Π°Π΅ с Crimson ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ созданный Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ DOM ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° write () Ρƒ ΠΊΠ»Π°ΡΡΠ° org.apache.crimson.tree.XmlDocument. Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ символов (Writer) ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ² (OutputStream). ВмСстС с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ. Если использован ΠΏΠΎΡ‚ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ², Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ΡƒΠΊΠ°Π·Π°Π½Π° Π½Π΅ Π±Ρ‹Π»Π°, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ся UTF-8. Если использован ΠΏΠΎΡ‚ΠΎΠΊ символов вмСстС с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ, Ρ‚ΠΎ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для записи Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. Если Writer ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π±Π΅Π· ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ, Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° — Ссли это экзСмляр OutputStreamWriter, Ρ‚ΠΎ Π΄Π»Ρ выяснСния Ρ‡Ρ‚ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ зовётся Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ getEncoding (). Если ΠΆΠ΅ это Π΄Ρ€ΡƒΠ³ΠΎΠΉ Writer, Ρ‚ΠΎ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ записана Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρƒ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ UTF-8. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

XmlDocument doc = …;

OutputStream os = …;

doc.write (os, «Windows-1251 »);

Π’ Xerces для создания Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ классы ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° org.apache.xml.serialize. БобствСнно для записи ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс XMLSerializer, Π° Π΄Π»Ρ настройки Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° — класс OutputFormat. Π’ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Π΅ XMLSerializer ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±Π°ΠΉΡ‚ΠΎΠ², Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ символов. Π’ ΡΠ»ΡƒΡ‡Π°Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² символов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π² OutputFormat. Π’Π°ΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ Π² OutputFormat — Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС русскиС Π±ΡƒΠΊΠ²Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ прСдставлСны Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ΄ΠΎΠ², Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΊΠΎΠ³ΠΎ: «ΠΠ‘Π’ «Π΄Π»Ρ символов «ΠΠ‘Π’ ». ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

OutputStream os = …;

OutputFormat format = new OutputFormat (Method.XML, «Windows-1251 », true).

XMLSerializer serializer = new XMLSerializer (os, format);

serializer.serialize (doc);

Castor XML.

ΠŸΠ°ΠΊΠ΅Ρ‚ Castor ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΄ΠΎΠ»Π³ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ хранСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π’ Ρ‡ΠΈΡΠ»Π΅ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ ΠΎΠ½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ Π² ΡΠ΅Π±Π΅ подсистСму Castor XML, которая ΠΏΠΎ ΡΡƒΡ‚ΠΈ Π΄Π΅Π»Π° являСтся надстройкой Π½Π°Π΄ XML-парсСром ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡŒ XML-Ρ„Π°ΠΉΠ»ΠΎΠ². Castor XML ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ парсСр Xerces, поэтому ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Xerces ΠΏΠ΅Ρ€Π΅ΠΊΠΎΡ‡Ρ‘Π²Ρ‹Π²Π°ΡŽΡ‚ ΠΈ ΡΡŽΠ΄Π°. Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊ Castor Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΈ символов (Reader ΠΈ Writer), Π° ΡΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ€Π°ΡΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ XML-Ρ„Π°ΠΉΠ»Π°. Как ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Xerces XML-Ρ„Π°ΠΉΠ» Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ Π½ΡƒΠΆΠ½ΠΎ, Π²ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±Π°ΠΉΡ‚ΠΎΠ², Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ feature. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ эта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ прСдусмотрСна Π² Castor. Для этого Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» castor. properties (Π²Π·ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° orgexolabcastor Π² Ρ„Π°ΠΉΠ»Π΅ castor-0.9.3-xml.jar) Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ lib Π² JRE, ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ org.exolab.castor.sax.features. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

# Comma separated list of SAX 2 features that should be enabled.

# for the default parser.

#.

#org.exolab.castor.features=.

org.exolab.castor.sax.features=internet.

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚Π°ΠΌ стоит пСрСмСнная org.exolab.castor.features, Π½ΠΎ ΡΡ‚ΠΎ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ° — Ссли ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² ΠΈΡΡ…ΠΎΠ΄Π½ΠΈΠΊΠΈ, Ρ‚ΠΎ Ρ‚Π°ΠΌ анализируСтся org.exolab.castor.sax.features (это справСдливо для Castor вСрсии 0.9.3 ΠΎΡ‚ 03.07.2001). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ чтСния с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±Π°ΠΉΡ‚ΠΎΠ²:

public static Object load (Class cls, String mappingFile, InputStream is).

throws Exception.

{.

Mapping mapping = loadMapping (cls, mappingFile);

Unmarshaller unmarshaller = new Unmarshaller (cls);

unmarshaller. setMapping (mapping);

return unmarshaller. unmarshal (new InputSource (is));

}.

Для создания XML-Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ для Xerces. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

public static void save (Object obj, String mappingFile, OutputStream os, String encoding).

throws Exception.

{.

Mapping mapping = loadMapping (obj.getClass (), mappingFile);

try.

{.

XMLSerializer serializer = new XMLSerializer (os, new OutputFormat (Method.XML, encoding, true));

Marshaller marshaller = new Marshaller (serializer);

marshaller. setMapping (mapping);

marshaller. marshal (obj);

}.

finally { os. flush (); }.

}.

Для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΠ°ΠΏΠΏΠΈΠ½Π³Π° Π² ΡΡ‚ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:

private static Mapping loadMapping (Class cls, String mappingFile).

throws Exception.

{.

ClassLoader loader = cls. getClassLoader ();

Mapping mapping = new Mapping (loader);

mapping. loadMapping (new InputSource (loader.getResourceAsStream (mappingFile)));

return mapping;

}.

XSL

БпСцификация XSL описываСт стандарт Π½Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Когда ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ XSL выполняСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ, особых ΠΏΡ€ΠΈΡ‡ΠΈΠ½ для бСспокойства Π½Π΅Ρ‚ — ΠΈ Ρ‚ΠΎΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Unicode-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, поэтому Π½Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΈΠ· ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π² Π±Π°ΠΉΡ‚Ρ‹ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, ΠΌΠΎΠ³ΡƒΡ‰ΠΈΡ… ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π”Ρ€ΡƒΠ³ΠΎΠ΅ Π΄Π΅Π»ΠΎ, ΠΊΠΎΠ³Π΄Π° выполняСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· XML Π² HTML ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π² Ρ‚Скстовый Ρ„Π°ΠΉΠ». Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° задаётся настройкой Ρ‚Π΅Π³Π° xsl: output, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

Если XSLT-процСссор Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ, Ρ‚ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ»ΠΈ Π²Ρ‹Π΄Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ UTF-8 (ΠΈΠ»ΠΈ UTF-16). Если формируСтся HTML, Ρ‚ΠΎ XSLT-процСссор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π΅Π³ meta, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ использованная ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°:

Всё Π±Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ XSLT-процСссоры Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚Π΅Π³ (ΠΏΠΎ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΎΠ½ΠΈ ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Π½Ρ‹). Π’ Ρ‡Π°ΡΡ‚ности ΠΏΠ°ΠΊΠ΅Ρ‚ Cocoon Π΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚, Ρ‚.ΠΊ. ΠΏΠΎ ΡΠ»ΠΎΠ²Π°ΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎΠ½ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ этого ΠΏΠ°ΠΊΠ΅Ρ‚Π°. ВмСсто этого Ρ‚Π°ΠΌ поддСрТиваСтся ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ инструкции прСпроцСссора cocoon-format. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ вставки этой инструкции Π² XSL:

type= «text/html «.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ динамичСски ΠΌΠ΅Π½ΡΡ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. Если это Π½Π΅ Ρ‚рСбуСтся, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΈ ΡΡ‚атичСски (Π² ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅):

БобствСнно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° настраиваСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ cocoon.properties.

Новая вСрсия Cocoon 2.0 ΠΊΡ€ΠΎΠΌΠ΅ управлСния ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² ΠΏΠ»Π°Π½Π΅ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΠΆΠ΅ Π³Π°Ρ€Π°Π·Π΄ΠΎ большС. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π½Π° ΠΈΡ… ΡΠ°ΠΉΡ‚Π΅.

Π’ ΡΠ»ΡƒΡ‡Π°Π΅ использования JAXP для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° (ΠΏΠ°ΠΊΠ΅Ρ‚ javax.xml.transform) ΠΊΡ€ΠΎΠΌΠ΅ использования Ρ‚Π΅Π³Π° xsl: output ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ setOutputProperty ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Transformer. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ сохранСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π² Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅:

TransformerFactory trFactory = TransformerFactory. newInstance ();

Transformer transformer = trFactory. newTransformer ();

transformer.setOutputProperty (OutputKeys.DOCTYPE_PUBLIC, docPublic);

transformer.setOutputProperty (OutputKeys.DOCTYPE_SYSTEM, docSystem);

transformer.setOutputProperty (OutputKeys.INDENT, «yes »);

transformer.setOutputProperty (OutputKeys.ENCODING, encoding);

OutputStream os = …;

StreamResult result = new StreamResult (os);

transformer.transform (source, result);

Π’ΡƒΡ‚ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹ΠΉ камСнь — рСализация Transformer Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ. Xalan ΠΈΠ· ΡΠΎΡΡ‚Π°Π²Π° JDK 1.4.0_x ΠΈ 1.4.1_x ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π΅ русскиС ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ — KOI8-R ΠΈ ISO-8859−5. Если хочСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Windows-1251, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ endorsed:

Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ %JAVA_HOME%jrelibendorsed.

ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Ρ‚ΡƒΠ΄Π° jar с ΠΏΡ€ΠΎΠΏΠ°Ρ‚Ρ‡Π΅Π½Ρ‹ΠΌ классом: XalanRusChars.jar.

Π’ JDK 1.4.2 Beta Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° новая вСрсия Xalan, которая Π²Ρ€ΠΎΠ΄Π΅ ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ 1251.

FOP.

ΠŸΠ°ΠΊΠ΅Ρ‚ FOP ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρƒ XSL FO (Formating Objects). Π’ Ρ‡Π°ΡΡ‚ности ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ PDF-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π° Π±Π°Π·Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² XML. Для прСобразования ΠΈΠ· ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ XML Π² FO ΠΏΠ°ΠΊΠ΅Ρ‚ FOP ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ XSLT-процСссор Xalan Π² ΠΏΠ°Ρ€Π΅ с Xerces. Для создания ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ изобраТСния Π² FOP Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ русскиС Π±ΡƒΠΊΠ²Ρ‹. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ это для вСрсии 0.20.1:

Π’ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ conffonts (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² c: fop-0.20.1conffonts) ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ttf ΠΈΠ· ΡΠΈΡΡ‚Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Windows. Для Arial normal/normal, normal/bold, italic/normal ΠΈ italic/bold Π½ΡƒΠΆΠ½Ρ‹ Ρ„Π°ΠΉΠ»Ρ‹ arial. ttf, arialbd. ttf, ariali. ttf ΠΈ arialbi.ttf.

Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ описаний ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ² (Ρ‚ΠΈΠΏΠ° arial. xml). Для этого для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡˆΡ€ΠΈΡ„Ρ‚Π° Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ (это для Arial normal/normal, всё Π² ΠΎΠ΄Π½Ρƒ строку):

javacp .;c:fop-0.20.1buildfop.jar;c:fop-0.20.1libbatik.jar;

c: fop-0.20.1libxalan-2.0.0.jar;c:fop-0.20.1libxerces.jar;

c: fop-0.20.1libjimi-1.0.jar.

org.apache.fop.fonts.apps.TTFReader fontsarial. ttf fontsarial.xml.

Π’ FOP Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² conf/userconfig.xml описаниС ΡˆΡ€ΠΈΡ„Ρ‚Π° с Ρ€ΡƒΡΡΠΊΠΈΠΌΠΈ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ, Ρ‚ΠΈΠΏΠ°:

Аналогично Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Arial normal/bold, italic/normal ΠΈ italic/bold.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ FOP ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки послС org.apache.fop.apps.Fop ΠΏΠΈΡΠ°Ρ‚ΡŒc c: fop-0.20.1confuserconfig.xml Если Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ FOP ΠΈΠ· ΡΠ΅Ρ€Π²Π»Π΅Ρ‚Π°, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π² ΡΠ΅Ρ€Π²Π»Π΅Ρ‚Π΅ послС строчки.

Driver driver = new Driver ();

Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ строчки:

// ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ fonts (c:weblogicfonts) Π±Ρ‹Π» создан ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для удобства.

String userConfig = «fonts/userconfig.xml » ;

File userConfigFile = new File (userConfig);

Options options = new Options (userConfigFile);

Π’ΠΎΠ³Π΄Π° располоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ² ttf Π² Ρ„Π°ΠΉΠ»Π΅ userconfig. xml ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ корня сСрвСра прилоТСния, Π±Π΅Π· указания Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ:

Π’ Ρ„Π°ΠΉΠ»Π΅ FO (ΠΈΠ»ΠΈ XML ΠΈ XSL) ΠΏΠ΅Ρ€Π΅Π΄ использованиСм ΡˆΡ€ΠΈΡ„Ρ‚Π° ΠΏΠΈΡΠ°Ρ‚ΡŒ:

font-family= «Arial «.

font-weight= «bold «(Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Arial bold).

font-style= «italic «(Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Arial italic).

Π”Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ прислал АлСксСй Π’ΡŽΡ€ΠΈΠ½, Π·Π° Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ спасибо.

Если Π’Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ встроСнный Π² FOP просмотрщик, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡Π΅ΡΡ‚ΡŒ Π΅Π³ΠΎ особСнности. Π’ Ρ‡Π°ΡΡ‚ности, хотя прСдполагаСтся, Ρ‡Ρ‚ΠΎ надписи Π² Π½Ρ‘ΠΌ русифицированы, Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ сдСлано это с ΠΎΡˆΠΈΠ±ΠΊΠΎΠΉ (Π² Π²Π΅Ρ€ΡΠΈΠΈ 0.19.0). Для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ надписСй ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² рСсурсов Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ org.apache.fop.viewer.resources ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ собствСнный Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ (класс org.apache.fop.viewer.LoadableProperties). ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° чтСния Ρ‚Π°ΠΌ Тёстко зафиксирована (88591, ΠΊΠ°ΠΊ ΠΈ Π² ΡΠ»ΡƒΡ‡Π°Π΅ Properties. load ()), ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° записи Π²ΠΈΠ΄Π° «uXXXX «Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π°. Π― ΡΠΎΠΎΠ±Ρ‰ΠΈΠ» ΠΎΠ± ΡΡ‚ΠΎΠΉ ошибкС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ, ΠΎΠ½ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ Π΅Ρ‘ ΠΈΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΡΠ²ΠΎΠΈ ΠΏΠ»Π°Π½Ρ‹.

ΠšΡ€ΠΎΠΌΠ΅ всСго ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ сущСствуСт сайт посвящённый русификации FOP (internet Π’Π°ΠΌ Π’Ρ‹ ΡΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ дистрибутив FOP с ΡƒΠΆΠ΅ исправлСнными ошибками ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ русскими ΡˆΡ€ΠΈΡ„Ρ‚Π°ΠΌΠΈ.

POI.

ΠŸΠ°ΠΊΠ΅Ρ‚ Jakarta POI ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Microsoft Office. Пока Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ Ρ‚Π°ΠΌ являСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² MS Excel (xls). Особой слоТности Π² Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ€ΡƒΡΡΠΊΠΈΠΌ языком Π½Π΅Ρ‚, Π½ΠΎ Π½Π°Π΄ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ нюанс, Ρ‡Ρ‚ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΡ‡Π΅ΠΊΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс org.apache.poi.hssf.usermodel.Cell, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ setEncoding (short encoding), ΠΎΠ΄Π½Π°ΠΊΠΎ вмСсто ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹Ρ… «Cp1255 «ΠΈ «Cp866 », Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ константы ENCODING_COMPRESSED_UNICODE (0) ΠΈ ENCODING_UTF16 (1). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, Π° Π΄Π»Ρ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€ΡƒΡΡΠΊΠΈΠΌ языком Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ENCODING_UTF16. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Ρ‡Ρ‚ΠΎ самоС Π²Π°ΠΆΠ½ΠΎΠ΅, эту установку Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ, создаваСмой ячСйки. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:

HSSFWorkbook wb = new HSSFWorkbook ();

HSSFSheet sheet = wb. createSheet («Sheet1 »);

HSSFRow row = sheet. createRow ((short)0);

for (int i = 0; i < 10; i++).

{.

HSSFCell cell = row. createCell ((short)i);

cell. setEncoding ((short)cell.ENCODING_UTF16);

cell. setCellValue («Π’Сст русского языка »);

}.

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ лист с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ содСрТащим русскиС символы, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡŽ, Π½Π΅ ΡƒΠ΄Π°Ρ‘тся. Π”Π°Π½Π½ΠΎΠ΅ описаниС прислал ВячСслав Π―ΠΊΠΎΠ²Π΅Π½ΠΊΠΎ, Π·Π° Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ спасибо.

CORBA.

Π’ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π΅ CORBA прСдусмотрСн Ρ‚ΠΈΠΏ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Java-овскому Ρ‚ΠΈΠΏΡƒ String. Π­Ρ‚ΠΎ Ρ‚ΠΈΠΏ wstring. Всё Π±Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ CORBA-сСрвСра Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π΅Π³ΠΎ Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅. Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈ спотыкании Π½Π° Ρ€ΡƒΡΡΠΊΠΈΡ… Π±ΡƒΠΊΠ²Π°Ρ…: org.omg.CORBA.MARSHAL: minor code 5 completed No ΠΈΠ»ΠΈ org.omg.CORBA.DATA_CONVERSION. Π›ΡƒΡ‡ΡˆΠ΅ всСго, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ CORBA-сСрвСр. К ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡŽ Ρƒ ΠΌΠ΅Π½Ρ Π½Π΅Ρ‚ статистики, поэтому я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Если ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ систСму Π½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚авляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ, ΠΌΠΎΠΆΠ½ΠΎ вмСсто Ρ‚ΠΈΠΏΠ° wstring ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ string Π² ΠΏΠ°Ρ€Π΅ с Π½Π°ΡˆΠΈΠΌ Π»ΡŽΠ±ΠΈΠΌΡ‹ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ:

// БСрвСрная Ρ‡Π°ΡΡ‚ΡŒ.

a = new Answer (new String (src.getBytes («Cp1251 »), «ISO-8859−1 »));

// ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ.

Answer answer=serverRef.getAnswer ();

res = new String (answer.msg.getBytes («ISO-8859−1 »), «Cp1251 »);

Π’ΠΈΠΏ wstring ΠΏΡ€ΠΈ этом Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ Ρ‚Π΅ΠΌ самым Π’Ρ‹ ΠΊΡ€ΠΈΠ²ΠΎΡΡ‚ΡŒ сСрвСра Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΡ€ΠΈΠ²ΠΎΡΡ‚ΡŒΡŽ своих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π° ΡΡ‚ΠΎ практичСски всСгда Ρ‡Ρ€Π΅Π²Π°Ρ‚ΠΎ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

ВмСсто Cp1251 ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ русских Π±ΡƒΠΊΠ², ΠΏΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΡŽ. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ строки Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… языках. Π’Π°ΠΊΠΆΠ΅, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ связь с Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ Π½Π΅-Java ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ использовали Ρ‚ΠΈΠΏ string.

ЧСстно говоря, Π½Π΅ Π»Π΅ΠΆΠΈΡ‚ Ρƒ ΠΌΠ΅Π½Ρ Π΄ΡƒΡˆΠ° ΠΊ Ρ‚Π°ΠΊΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌ, Π½Ρƒ Π΄Π° Ρ‡Ρ‚ΠΎ подСлаСшь, ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ СдинствСнноС.

JNI.

JNI (Java Native Interface) — это стандарт ΠΏΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ с C/C+±Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Как ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π»ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Π½Π° ΡΡ‚ΠΎΠΌ Π²ΠΎΠ΄ΠΎΡ€Π°Π·Π΄Π΅Π»Π΅ Ρ‚ΠΎΠΆΠ΅ происходит столкновСниС Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ C/C+±Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π±Π΅Π· ΡƒΡ‡Ρ‘Ρ‚Π° Unicode, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ программисты Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π½Π°ΡŽΡ‚ ΠΎ Π½Ρ‘ΠΌ. Π― ΡΠ°ΠΌ, Π·Π° 7 Π»Π΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° Π½Π° C/C++, ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°Ρ‡Π°Π» ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° Java, ΠΏΡ€ΠΎ Unicode Π·Π½Π°Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Π½Π°ΡΠ»Ρ‹ΡˆΠΊΠ΅. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ строковых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² C/C++ сдСланы для 8-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сишного Ρ‚ΠΈΠΏΠ° char. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π²ΠΈΠΆΠΊΠΈ Π² ΡΡ‚ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ, Π² Ρ‡Π°ΡΡ‚ности для Windows NT ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Unicode-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ Win32 API, Π½ΠΎ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡŽ, этого часто нСдостаточно.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ главная Π·Π°Π΄Π°Ρ‡Π° — ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ char* ΠΈΠ· Ρ‚ΠΈΠΏΠ° jstring (JNI-шноС ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ String) ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ Π²ΠΎ Π²ΡΠ΅Ρ… описаниях ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… JNI для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ GetStringUTFChars ()/ReleaseStringUTFChars (). ΠšΠΎΠ²Π°Ρ€Π½Ρ‹Π΅ Π±ΡƒΡ€ΠΆΡƒΠΈΠ½Ρ‹ ΠΈ Π·Π΄Π΅ΡΡŒ ΠΏΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ засаду — эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ массив Π±Π°ΠΉΡ‚ΠΎΠ² ΠΏΠΎ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρƒ UTF, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ соотвСтствуСт ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΌΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ASCII-символов (ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 128 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ). РусскиС Π±ΡƒΠΊΠ²Ρ‹ ΠΎΠΏΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ»Ρ‘Ρ‚Π΅. Π‘ΠΈΡˆΠ½Ρ‹Π΅ строки char* ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ лоТатся Π½Π° Java-овский Ρ‚ΠΈΠΏ byte[], Π½ΠΎ ΠΏΡ€ΠΈ этом Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π·Π°Π³Π²ΠΎΠ·Π΄ΠΊΠ° Π² Π²ΠΈΠ΄Π΅ ноль-символа. Π•Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ byte[]->char* ΠΈ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

public void action (String msg) throws java.io.IOException.

{.

int res = nAction (msg);

if (res≠0) throw new java.io.IOException (nGetErrorString (res));

}.

private native int nAction (String msg);

private native String nGetErrorString (int error);

jbyteArray getStringBytes (JNIEnv *env, jstring str).

{.

if (!str) return NULL;

jmethodID getBytes = env->GetMethodID (env->GetObjectClass (str), «getBytes », «()[B »);

jbyteArray buf = (jbyteArray)env->CallObjectMethod (str, getBytes);

if (!buf) return NULL;

// ДобавляСм ноль-символ.

jsize len = env->GetArrayLength (buf);

jbyteArray nbuf = env->NewByteArray (len+1);

if (len≠0).

{.

jbyte *cbuf = env->GetByteArrayElements (buf, NULL);

env->SetByteArrayRegion (nbuf, 0, len, cbuf);

env->ReleaseByteArrayElements (buf, cbuf, JNI_ABORT);

}.

env->DeleteLocalRef (buf);

return nbuf;

}.

JNIEXPORT jint JNICALL Java_Test_nAction.

(JNIEnv *env, jobject obj, jstring msg).

{.

jbyteArray bmsg = getStringBytes (env, msg);

if (!bmsg) return -1;

jbyte *cmsg = env->GetByteArrayElements (bmsg, NULL);

printf (cmsg);

jint res = do_something (cmsg);

env->ReleaseByteArrayElements (bmsg, cmsg, JNI_ABORT);

return res;

}.

jstring newString (JNIEnv *env, jbyteArray jbuf, int len).

{.

jclass stringClass = env->FindClass («java/lang/String »);

if (!stringClass) return NULL;

jmethodID init = env->GetMethodID (stringClass, «», «([BII)V »);

if (!init) return NULL;

return (jstring)env->NewObject (stringClass, init, jbuf, 0, len);

}.

jstring newString (JNIEnv *env, const char *buf).

{.

if (!buf) return NULL;

int bufLen = strlen (buf);

if (bufLen==0).

{.

return env->NewString ((const jchar *)L «», 0);

}.

jbyteArray jbuf = env->NewByteArray (bufLen);

if (!jbuf) return NULL;

env->SetByteArrayRegion (jbuf, 0, bufLen,(jbyte*)buf);

jstring jstr = newString (env, jbuf, bufLen);

env->DeleteLocalRef (jbuf);

return jstr;

}.

JNIEXPORT jstring JNICALL Java_Test_nGetErrorString.

(JNIEnv *env, jobject obj, jint error).

{.

char cmsg[256];

memset (cmsg, 0, sizeof (cmsg));

get_error_string (error, cmsg, sizeof (cmsg));

return newString (env, cmsg);

}.

Π’ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ символов ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‡Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ СстСствСнно ΠΏΡ€ΠΈ взаимодСйствиях с ΡΠΈΡΡ‚Π΅ΠΌΠ½Ρ‹ΠΌ API. Если ΠΆΠ΅ Π’Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° опрСдСлённая кодовая страница, соотвСтствСнно Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‘ Π½Π°Π·Π²Π°Π½ΠΈΠ΅.

GUI (AWT, Swing).

МногиС ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ русских Π±ΡƒΠΊΠ² с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ установкой ΡˆΡ€ΠΈΡ„Ρ‚Π°. На ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π² Java всё слоТнСС ΠΈ Ρ€Π΅Π΄ΠΊΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ связанно со ΡˆΡ€ΠΈΡ„Ρ‚Π°ΠΌΠΈ.

Π“Π΄Π΅ ΠΆΠ΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»Π΅ΠΆΠ°Ρ‚ наибольшиС ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ? Π’ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ это связанно с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ символов. Π§Π°ΡΡ‚ΡŒ этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ описаны Π²Ρ‹ΡˆΠ΅. Если Ρƒ Π’ас всС прСобразования Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, ΠΈ Π΄Π»Ρ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡˆΡ€ΠΈΡ„Ρ‚ Unicode, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ большой шанс, Ρ‡Ρ‚ΠΎ Π’Π°ΡˆΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Если ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ всё ΠΆΠ΅ ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ, Ρ‚ΡƒΡ‚ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ JVM, ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ, Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… Π±Ρ€ΠΎΡƒΠ·Π΅Ρ€Π°Ρ…. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ достаточно ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° поиска ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ Π½ΠΈΠΆΠ΅, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки.

Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½ΠΈΠ³Π΄Π΅ — Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½Π΅ΠΉ ΠΈ Π² Π’Π°ΡˆΠΈΡ… Ρ€ΡƒΠΊΠ°Ρ…. Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ всё, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ написано Π²Ρ‹ΡˆΠ΅, ΠΈ ΠΈΡ‰ΠΈΡ‚Π΅. Если ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° проявляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ — Π·Π½Π°Ρ‡ΠΈΡ‚ Π΄Π΅Π»ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² Π½Π°ΡΡ‚Ρ€ΠΎΠΉΠΊΠ°Ρ…. Π“Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ — зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ графичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Π’Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ. Если AWT — ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ настройка Ρ„Π°ΠΉΠ»Π° font.properties.ru. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ ΠΈΠ· Java 2. Если Ρƒ Π’ас Π½Π΅Ρ‚ этой вСрсии, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π΅Π³ΠΎ с Π΄Π°Π½Π½ΠΎΠ³ΠΎ сайта: вСрсия для Windows, вСрсия для Linux (см. Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Π΄Π΅Π» ΠΏΠΎ Linux Π½ΠΈΠΆΠ΅). Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» Π·Π°Π΄Π°Ρ‘Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹ ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Π΅ страницы. Если Ρƒ Π’ас установлСна русская вСрсия OS — просто Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ этот Ρ„Π°ΠΉΠ» Ρ‚ΡƒΠ΄Π°, Π³Π΄Π΅ Π»Π΅ΠΆΠΈΡ‚ Ρ„Π°ΠΉΠ» font.properties. Если ΠΆΠ΅ это англицкая вСрсия, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ, ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ этот Ρ„Π°ΠΉΠ» вмСсто font. properties ΠΈΠ»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ Ρ€Π΅Π³ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ настройки Π½Π° Ρ€ΡƒΡΡΠΊΠΈΠ΅. Иногда ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ настройкаDuser. language=ru, Π½ΠΎ Ρ‡Π°Ρ‰Π΅ — Π½Π΅Ρ‚. Π’ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π΅ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Ρ‡Ρ‚ΠΎ ΠΈ Ρ file. encoding — сработаСт ΠΈΠ»ΠΈ Π½Π΅Ρ‚, зависит ΠΎΡ‚ JDK (см. ΠΎΡˆΠΈΠ±ΠΊΡƒ Π·Π° Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 4 152 725).

Если ΠΊΡ€ΠΎΠΌΠ΅ русских Π±ΡƒΠΊΠ² Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π΄ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, грСчСскиС, Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ достаточно просто ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΡ… ΠΊΠΎΠ΄Π°. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ всё это ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ способом:

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² AWT ΠΈ Swing ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹, настраиваСмыС Π² font.properties.ru (dialog, dialoginput ΠΈ Ρ‚. Π΄.). Π­Ρ‚ΠΈ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ ΠΊΠΎΠ΄Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ символа ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ². НапримСр, Π²ΠΎΡ‚ эти строчки:

dialog.0=Arial, RUSSIAN_CHARSET.

dialog.1=WingDings, SYMBOL_CHARSET, NEED_CONVERTED.

dialog.2=Symbol, SYMBOL_CHARSET, NEED_CONVERTED.

Π·Π°Π΄Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚ dialog ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ начСртания состоит ΠΈΠ· 3-Ρ… ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ² (Arial, WingDings ΠΈ Symbol). Π”Π°Π»Π΅Π΅, Π²ΠΎΡ‚ эти строчки:

fontcharset.dialog.0=sun.io.CharToByteCp1251.

fontcharset.dialog.1=sun.awt.windows.CharToByteWingDings.

fontcharset.dialog.2=sun.awt.CharToByteSymbol.

Π·Π°Π΄Π°ΡŽΡ‚, ΠΊΠ°ΠΊΠΈΠ΅ классы Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для пСрСкодирования ΠΈΠ· Unicode Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡˆΡ€ΠΈΡ„Ρ‚Π°. ΠŸΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ символов сначала ищСтся, Π² ΠΊΠ°ΠΊΠΎΠΌ ΡˆΡ€ΠΈΡ„Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ символы. Π­Ρ‚ΠΎ опрСдСляСтся Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ символы ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ классы. Π•ΡΡ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ настройка (exclusion), которая явно Π·Π°Π΄Π°Ρ‘Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ символов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡˆΡ€ΠΈΡ„Ρ‚Π°. НапримСр, Π²ΠΎΡ‚ эта строка.

exclusion.dialog.0=0100−0400,0460-ffff.

Π·Π°Π΄Π°Ρ‘Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ символов с ΠΊΠΎΠ΄Π°ΠΌΠΈ ΠΎΡ‚ 0100 Π΄ΠΎ 0400 ΠΈ ΠΎΡ‚ 0460 Π΄ΠΎ ffff ΡˆΡ€ΠΈΡ„Ρ‚ 0 (Arial) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ ΡΠ»Π΅Π΄ΡƒΠ΅Ρ‚. Π­Ρ‚Π° строка Π½ΡƒΠΆΠ½Π°, Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ, для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ грСчСских символов ΡˆΡ€ΠΈΡ„Ρ‚ 0 (Arial) Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ exclusion, ΡˆΡ€ΠΈΡ„Ρ‚ 1 (WingDings) Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚, Ρ‚.ΠΊ. Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ CharToByteWingDings ΠΎΠ½ΠΈ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ поэтому ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡˆΡ€ΠΈΡ„Ρ‚ 2 (Symbol), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅ΡΡ‚ΡŒ грСчСскиС символы.

Π‘ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Swing всё ΠΏΡ€ΠΎΡ‰Π΅ — Π² Π½Π΅ΠΉ всё рисуСтся Ρ‡Π΅Ρ€Π΅Π· подсистСму Java2D. Надписи Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Ρ… Π΄ΠΈΠ°Π»ΠΎΠ³Π°Ρ… (JOptionPane, JFileChooser, JColorChooser) ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π° Ρ€ΡƒΡΡΠΊΠΈΠΉ ΠΎΡ‡Π΅Π½ΡŒ просто — достаточно лишь ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² рСсурсов. Π― ΡΡ‚ΠΎ ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π», Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π²Π·ΡΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² libext ΠΈΠ»ΠΈ Π² CLASSPATH. ЕдинствСнная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я ΡΡ‚олкнулся — Π² Π²Π΅Ρ€ΡΠΈΡΡ… JDK начиная с 1.2 rc1 ΠΈ ΠΏΠΎ 1.3 beta, русскиС Π±ΡƒΠΊΠ²Ρ‹ Π½Π΅ Π²Ρ‹Π²ΠΎΠ΄ΡΡ‚ся ΠΏΠΎΠ΄ Win9x ΠΏΡ€ΠΈ использовании стандартных ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ² (Arial, Courier New, Times New Roman, etc.) ΠΈΠ·-Π·Π° ошибки Π² Java2D. Ошибка вСсьма своСобразна — со ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΌΠΈ ΡˆΡ€ΠΈΡ„Ρ‚Π°ΠΌΠΈ изобраТСния Π±ΡƒΠΊΠ² ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π½Π΅ Π² ΡΠΎΠΎΡ‚вСтствии с ΠΊΠΎΠ΄Π°ΠΌΠΈ Unicode, Π° ΠΏΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Cp1251 (ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Ansi). Π­Ρ‚Π° ошибка зарСгистрирована Π² BugParade ΠΏΠΎΠ΄ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 4 192 443. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Swing ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ font.properties.ru, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ достаточно Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ — ΠΈ Ρ€ΡƒΡΡΠΊΠΈΠ΅ Π±ΡƒΠΊΠ²Ρ‹ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ. К ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡŽ, Π½Π°Π±ΠΎΡ€ Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ² нСбольшой — это ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹ Tahoma, Tahoma Bold ΠΈ Π΄Π²Π° Π½Π°Π±ΠΎΡ€Π° ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ² ΠΈΠ· Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈΠ²Π° JDK — Lucida Sans * ΠΈ Lucida Typewriter * (ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° font.properties.ru). Π§Π΅ΠΌ эти ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Ρ… — ΠΌΠ½Π΅ нСпонятно.

Начиная с Π²Π΅Ρ€ΡΠΈΠΈ 1.3rc1 эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΡƒΠΆΠ΅ исправлСна, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ просто ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ JDK. JDK 1.2 ΡƒΠΆΠ΅ сильно устарСл, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ я Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π’Π°ΠΊ ΠΆΠ΅ Π½Π°Π΄ΠΎ ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ с ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ вСрсиСй Win95 ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Unicode — Π² ΡΡ‚ΠΎΠΉ ситуации ΠΌΠΎΠΆΠ½ΠΎ просто ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹ ΠΈΠ· Win98 ΠΈΠ»ΠΈ WinNT.

Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки, ΠΈΠ»ΠΈ «ΠΊΡƒΠ΄Π° дСлась Π±ΡƒΠΊΠ²Π° Π¨? «.

Π‘ΡƒΠΊΠ²Π° Π¨.

Π­Ρ‚ΠΎΡ‚ вопрос («ΠΊΡƒΠ΄Π° дСлась Π±ΡƒΠΊΠ²Π° Π¨? ») довольно часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρƒ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… программистов Π½Π° Java. Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрёмся, ΠΊΡƒΠ΄Π° ΠΆΠ΅ ΠΎΠ½Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‡Π°Ρ‰Π΅ всСго дСваСтся. :-).

Π’ΠΎΡ‚ типичная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π°-ля HelloWorld:

public class Test.

{.

public static void main (String[] args).

{.

System.out.println («Π™Π¦Π£ΠšΠ•ΠΠ“Π¨Π©Π—Π₯Πͺ »);

}.

}.

Π² Far-Π΅ сохраняСм Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² Ρ„Π°ΠΉΠ» Test. java, компиляСм…

C:>javac Test.java.

ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Π΅ΠΌ…

C:>java Test.

Π™Π¦Π£ΠšΠ•ΠΠ“?Π©Π—Π₯Πͺ Π§Ρ‚ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ? ΠšΡƒΠ΄Π° дСлась Π±ΡƒΠΊΠ²Π° Π¨? Π’Π΅ΡΡŒ фокус здСсь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° взаимокомпСнсация Π΄Π²ΡƒΡ… ошибок. ВСкстовый Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π² Far ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ создаёт Ρ„Π°ΠΉΠ» Π² DOS-ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ (Cp866). ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΆΠ΅ javac для чтСния исходника ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ file. encoding (Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΈΠ½ΠΎΠ΅ ΠΊΠ»ΡŽΡ‡ΠΈΠΊΠΎΠΌencoding). А Π² ΡΡ€Π΅Π΄Π΅ Windows с Ρ€ΡƒΡΡΠΊΠΈΠΌΠΈ Ρ€Π΅Π³ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ настройками ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся Cp1251. Π­Ρ‚ΠΎ пСрвая ошибка. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π² ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Test. class символы ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ ΠΊΠΎΠ΄Π°. Вторая ошибка состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ стандартный PrintStream, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ настройку ΠΈΠ· file. encoding, ΠΎΠ΄Π½Π°ΠΊΠΎ консольноС ΠΎΠΊΠ½ΠΎ Π² Windows ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ символы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ DOS. Если Π±Ρ‹ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Cp1251 Π±Ρ‹Π»Π° Π²Π·Π°ΠΈΠΌΠΎΠΎΠ΄Π½Π°Π·Π½Π°Ρ‡Π½ΠΎΠΉ, Ρ‚ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ. Но ΡΠΈΠΌΠ²ΠΎΠ» Π¨ Π² Cp866 ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠ΄ 152, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Cp1251 Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½, ΠΈ ΠΏΠΎΡΡ‚ΠΎΠΌΡƒ отобраТаСтся Π½Π° Unicode-символ 0xFFFD. Когда происходит ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· char Π² byte, вмСсто Π½Π΅Π³ΠΎ подставляСтся символ "? «.

На Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ€Π²Π°Ρ‚ΡŒΡΡ, Ссли ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ символы ΠΈΠ· Ρ‚Скстового Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ java.io.FileReader, Π° Π·Π°Ρ‚Π΅ΠΌ вывСсти ΠΈΡ… Π½Π° ΡΠΊΡ€Π°Π½ Ρ‡Π΅Ρ€Π΅Π· System.out.println (). Если Ρ„Π°ΠΉΠ» Π±Ρ‹Π» записан Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ Cp866, Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Ρ‚ΠΈ Π²Π΅Ρ€Π½ΠΎ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ Π±ΡƒΠΊΠ²Ρ‹ Π¨.

ΠŸΡ€ΡΠΌΠ°Ρ конвСрсия bytechar.

Π­Ρ‚Π° ошибка являСтся любимой Ρƒ Π·Π°Ρ€ΡƒΠ±Π΅ΠΆΠ½Ρ‹Ρ… программистов Π½Π° Java. Она довольно ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрСна Π² Π½Π°Ρ‡Π°Π»Π΅ описания. Если Π’Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‡ΡƒΠΆΠΈΠ΅ исходники, Ρ‚ΠΎ Π²ΡΠ΅Π³Π΄Π° ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ²Π½ΡƒΡŽ ΠΊΠΎΠ½Π²Π΅Ρ€ΡΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ² — (byte) ΠΈΠ»ΠΈ (char). Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ часто Π² Ρ‚Π°ΠΊΠΈΡ… мСстах Π·Π°ΠΊΠΎΠΏΠ°Π½Ρ‹ Π³Ρ€Π°Π±Π»ΠΈ.

Алгоритм поиска ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Ρ€ΡƒΡΡΠΊΠΈΠΌΠΈ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ Если Π’Ρ‹ Π½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚авляСтС сСбС Π³Π΄Π΅ Π² Π’Π°ΡˆΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ потСря русских Π±ΡƒΠΊΠ², Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСст. Π›ΡŽΠ±ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. РусскиС Π±ΡƒΠΊΠ²Ρ‹ — это Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΠ½ΠΈ проходят Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Ρ‚Ρ€ΠΈ стадии ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ: ΠΎΠ½ΠΈ ΠΎΡ‚ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π²Ρ…ΠΎΠ΄), ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΡΡ‚ся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ (Π²Ρ‹Ρ…ΠΎΠ΄). Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ мСсто ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π½Π°Π΄ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ вмСсто Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°ΡˆΠΈΡ‚ΡŒ Π² ΠΈΡΡ…ΠΎΠ΄Π½ΠΈΠΊ Ρ‚Π°ΠΊΡƒΡŽ Ρ‚Π΅ΡΡ‚ΠΎΠ²ΡƒΡŽ строку: «ΠΠ‘Π’u0410u0411u0412 », ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ Π²Ρ‹Π²Π΅ΡΡ‚ΠΈ. ПослС этого смотритС, Ρ‡Ρ‚ΠΎ Ρƒ Π’ас Π²Ρ‹Π²Π΅Π»ΠΎΡΡŒ:

Если Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ «ΠΠ‘ВАБВ », Π·Π½Π°Ρ‡ΠΈΡ‚ компиляция исходников ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Ρƒ Π’ас Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Если Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ " ???АБВ «(ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ символы ΠΊΡ€ΠΎΠΌΠ΅ «ΠΠ‘Π’ «Π½Π° ΠΌΠ΅ΡΡ‚Π΅ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Ρ‚Ρ€Ρ‘Ρ… Π±ΡƒΠΊΠ²), Π·Π½Π°Ρ‡ΠΈΡ‚ Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π½ΠΎ Π²ΠΎΡ‚ компиляция исходников происходит Π½Π΅Π²Π΅Ρ€Π½ΠΎ — скорСй всСго Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ ΠΊΠ»ΡŽΡ‡ΠΈΠΊencoding.

Если Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ " ??? «(ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ символы ΠΊΡ€ΠΎΠΌΠ΅ «ΠΠ‘Π’ «Π½Π° ΠΌΠ΅ΡΡ‚Π΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‚Ρ€ΠΎΠΉΠΊΠΈ Π±ΡƒΠΊΠ²), Π·Π½Π°Ρ‡ΠΈΡ‚ Π²Ρ‹Π²ΠΎΠ΄ Ρƒ Π’ас Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅Π²Π΅Ρ€Π½ΠΎ.

Настроив Π²Ρ‹Π²ΠΎΠ΄ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΈ ΡΠΎ Π²Ρ…ΠΎΠ΄ΠΎΠΌ. ПослС настройки всСй Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΡ‡Π΅Π·Π½ΡƒΡ‚ΡŒ.

Об ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅ native2ascii.

Π­Ρ‚Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΡΠΎΡΡ‚Π°Π² Sun JDK ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для прСобразования исходных тСкстов ΠΊ ASCII-Π²ΠΈΠ΄Ρƒ. Она Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ, Π° Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ записываСт символы Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ «uXXXX ». Если ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈΠΊreverse, Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ΅Ρ‚ся обратная конвСртация. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° для ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² рСсурсов (.properties) ΠΈΠ»ΠΈ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ исходников, Ссли Π’Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΡŒΡΡ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ… с ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ Ρ€ΡƒΡΡΠΊΠΈΡ… Ρ€Π΅Π³ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ настройками.

Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΌ Π²Ρ…ΠΎΠ΄ΠΎΠΌ (stdin), Π° Π½Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ подсказку ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌ, ΠΊΠ°ΠΊ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈ Π½Π΅ Π΄ΠΎΠ³Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ся ΠΎ Π½Π΅ΠΎΠ±Ρ…одимости указания ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (ΠΊΡ€ΠΎΠΌΠ΅, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π°ΡˆΡ‘Π» Π² ΡΠ΅Π±Π΅ силы ΠΈ ΠΌΡƒΠΆΠ΅ΡΡ‚Π²ΠΎ Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Ρ‚Π°ΠΊΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ :-). ΠœΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅ΠΌ этой ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅ для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ (ΠΊΠ»ΡŽΡ‡ΠΈΠΊencoding). Если этого Π½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ использована ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (file.encoding), Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ нСсколько расходится с ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΉ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ ΠΊΠΎΠ΄Π° Π±ΡƒΠΊΠ² (ΠΈΠ·-Π·Π° Π½Π΅Π²Π΅Ρ€Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ вСсьма ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΏΠΎΠΈΡΠΊ ошибок Π² Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π²Π΅Ρ€Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅.

О ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ символов.

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ понимая Π΅Π³ΠΎ ΡΡƒΡ‚ΡŒ ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ. Он ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для восстановлСния Π²Π΅Ρ€Π½Ρ‹Ρ… ΠΊΠΎΠ΄ΠΎΠ² Π±ΡƒΠΊΠ², Ссли ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π½Π΅Π²Π΅Ρ€Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. Π‘ΡƒΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° проста: ΠΈΠ· ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π½Π΅Π²Π΅Ρ€Π½Ρ‹Ρ… символов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ страницу, восстанавливаСтся исходный массив Π±Π°ΠΉΡ‚ΠΎΠ². Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ· ΡΡ‚ΠΎΠ³ΠΎ массива Π±Π°ΠΉΡ‚ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΠΆΠ΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ страницу, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ΄Π° символов. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

String res = new String (src.getBytes («ISO-8859−1 »), «Cp1251 »);

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌ Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ этого ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько. НапримСр, для восстановлСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСвСрная страница, ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях. Другая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ страницы Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ byte char. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, описаниС ошибки Π·Π° Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 4 296 969.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этим ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ стоит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΡΠ°ΠΌΠΎΠΌ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΌ случаС, ΠΊΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ Π½ΠΈΡ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚, ΠΈ Π’Ρ‹ Ρ‡Ρ‘Ρ‚ΠΊΠΎ сСбС прСдставляСтС, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ происходит Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ символов.

РусскиС Π±ΡƒΠΊΠ²Ρ‹ ΠΈ MS JVM.

НСпонятно ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ сообраТСниям, Π½ΠΎ Π² Π½Π΅ΠΉ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ всС Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ русских Π±ΡƒΠΊΠ², акромя Cp1251 (Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ дистрибутива). Если Π’Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Cp866, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ классы Π² CLASSPATH. ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ классы ΠΎΡ‚ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ… вСрсий Sun JDK Π½Π΅ ΠΏΠΎΠ΄Ρ…одят — Ρƒ Sun-Π° ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ измСнилась ΠΈΡ… ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°, поэтому послСдниС вСрсии классов с Microsoft-ΠΎΠΌ Π½Π΅ ΡΡ‚Ρ‹ΠΊΡƒΡŽΡ‚ΡΡ (Ρƒ MS ΠΎΡΡ‚Π°Π»Π°ΡΡŒ структура ΠΎΡ‚ JDK 1.1.4). На ΡΠ΅Ρ€Π²Π΅Ρ€Π΅ Microsoft, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, Π»Π΅ΠΆΠΈΡ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ, Π½ΠΎ Ρ‚Π°ΠΌ Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΎΠΊΠΎΠ»ΠΎ 3 ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π° ΠΈΡ… ΡΠ΅Ρ€Π²Π΅Ρ€ Π΄ΠΎΠΊΠ°Ρ‡ΠΊΡƒ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ :-). МнС ΡƒΠ΄Π°Π»ΠΎΡΡŒ Ρ‚Π°ΠΊΠΈ Π²Ρ‹ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ этот Ρ„Π°ΠΉΠ», я Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π» jar-ΠΎΠΌ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π·ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚ΡΡŽΠ΄Π°.

Если ΠΆΠ΅ Π’Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π°ΠΏΠΏΠ»Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ MS JVM ΠΈ Π’Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΡ‚ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€Π΅) Π±Π°ΠΉΡ‚Ρ‹ Π² Ρ€ΡƒΡΡΠΊΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΎΡ‚ Cp1251 (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Cp866), Ρ‚ΠΎ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ Π’Ρ‹ ΡƒΠΆΠ΅ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ — Π°ΠΏΠΏΠ»Π΅Ρ‚Π°ΠΌ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ классы Π² ΡΠΈΡΡ‚Π΅ΠΌΠ½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΊΠΎΠΈΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС являСтся ΠΏΠ°ΠΊΠ΅Ρ‚ sun.io. Π’Ρ‹Ρ…ΠΎΠ΄Π° Ρ‚ΡƒΡ‚ Π΄Π²Π° — ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€Π΅ Π² Cp1251 (ΠΈΠ»ΠΈ Π² UTF-8) ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ· Π±Π°ΠΉΡ‚ΠΎΠ² Π² Unicode Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡŽ Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈΠ· Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ Π² Cp1251.

Руссификация Java ΠΏΠΎΠ΄ Linux.

Π‘ΠΊΠ°ΠΆΡƒ сразу — я Ρ Linux Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ, Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘нная здСсь информация ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° ΠΎΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Π΄Π°Π½Π½ΠΎΠ³ΠΎ описания. Если Π’Ρ‹ Π½Π°ΠΉΠ΄Ρ‘Ρ‚Π΅ Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ — Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΌΠ½Π΅.

ΠŸΡ€ΠΈ ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ JVM Π² Linux сущСствуСт Π΄Π²Π΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Ρ‹ Π² GUI-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ….

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²Π²ΠΎΠ΄Π° ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Ρ‹ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ (Π² X11).

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ способом (Π΄Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ прислал Artemy E. Kapitula):

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² X11 Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹ ttf ΠΈΠ· Windows NT/200. Π― Π±Ρ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» Arial, Times New Roman, Courier New, Verdana ΠΈ Tahoma — ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΡ… Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· сСрвСр ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ², Π° ΠΊΠ°ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» font.properties.ru Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ $JAVA_HOME/jre/lib.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²Π²ΠΎΠ΄Π° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ способом (Π΄Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ прислал ΠœΠΈΡ…Π°ΠΈΠ» Иванов):

Настройка Π²Π²ΠΎΠ΄Π° русских Π±ΡƒΠΊΠ² Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

Mandrake Linux 7.1.

XFree86 3.3.6.

IBM Java 1.3.0 (рСлизная).

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°:

IBM Java 1.3 Π½Π΅ Π΄Π°Π΅Ρ‚ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ русскиС Π±ΡƒΠΊΠ²Ρ‹ (Π²ΠΈΠ΄Π½Ρ‹ ΠΊΠ°ΠΊ крокозябры) ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎ Π½Π° Π»Π΅ΠΉΠ±Π»Π°Ρ… ΠΈ Π² ΠΌΠ΅Π½ΡŽΡ…Π°Ρ… ΠΈΡ… Π²ΠΈΠ΄Π½ΠΎ.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°:

использованиС XIM (-> xkb) Π² AWT. (это Π½Π΅ Π΅ΡΡ‚ΡŒ ΠΏΠ»ΠΎΡ…ΠΎ само ΠΏΠΎ ΡΠ΅Π±Π΅, просто с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΡˆΡ‚ΡƒΠΊΠ°ΠΌΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ остороТно + Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ»Π°Π΄Ρ‹ xkb Π½Π΅ Π»ΡŽΠ±ΡΡ‚).

РСшСниС:

ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ xkb (ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒ (xkb Π±Π΅Π· Π»ΠΎΠΊΠ°Π»ΠΈ ΠΠ• Π ΠΠ‘ΠžΠ’ΠΠ•Π’)).

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°:

выставляСтся локаль (Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ‚ΠΈΠΏΠ° Π² /etc/profile ΠΈΠ»ΠΈ Π² ~/.bash_profile).

export LANG=ru_RU.KOI8-R.

export LC_ALL=ru_RU.KOI8-R.

правится (Ссли это Π΅Ρ‰Π΅ Π½Π΅ ΡΠ΄Π΅Π»Π°Π½ΠΎ) /etc/X11/XF86Config. Π’ ΡΠ΅ΠΊΡ†ΠΈΠΈ Keyboard Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

XkbKeycodes «xfree86 «.

XkbTypes «default «.

XkbCompat «default «.

XkbSymbols «ru «.

XkbGeometry «pc «.

XkbRules «xfree86 «.

XkbModel «pc101 «.

XkbLayout «ru «.

XkbOptions «grp:shift_toggle » # ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ 2-мя ΡˆΠΈΡ„Ρ‚Π°ΠΌΠΈ.

#XkbOptions «grp:caps_toggle » # ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ caps-lock «ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: такая настройка xkb Π½Π΅ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠ° с xrus (ΠΈ Π΅ΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ° kikbd) Π° ΠΏΠΎΡΠ΅ΠΌΡƒ с Π½ΠΈΠΌΠΈ придСтся Ρ€Π°ΡΠΏΡ€ΠΎΡ‰Π°Ρ‚ΡŒΡΡ.

ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ X-Ρ‹. НуТно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ (Ρ‚ΠΈΠΏΠ° русскиС Π±ΡƒΠΊΠΎΠ²ΠΊΠΈ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ…).

font.properties.ru -> $JAVA_HOME/jre/lib.

fonts.dir -> $JAVA_HOME/jre/lib/fonts.

cd $JAVA_HOME/jre/lib/fonts; rm fonts. scale; lns fonts. dir fonts.scale.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ русскиС Π±ΡƒΠΊΠ²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΡΠ²ΠΈΠ½Π³Π΅ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Как Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ ссылки Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ font.properties.ru для Linux. ΠžΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² AWT ΠΈ Swing. БоотвСтствСнно Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌ.

Бписок Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹

Для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±Ρ‹Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ с ΡΠ°ΠΉΡ‚Π° internet.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ