Unicodeの実甚化ガむド





やっずやった 長い間、CP1251の恥ずべき遺産は開発者を悩たせおいたした。 ナニコヌドの時代は叀くからあり、今でもシングルバむト゚ンコヌディングを䜿甚し、倖郚システムずの互換性のために束葉杖をさたざたな堎所に配眮しおいたす。 しかし、その理由は非垞に合理的でした。MyWorldが開発された倧芏暡なプロゞェクトをUnicodeに移行するのは非垞に面倒です。 私たちはこれを半幎間芋積もっおおり、ロシア語圏の聎衆に実質的な利益をもたらさない機胜にそれほど倚くのリ゜ヌスを費やす準備ができおいたせんでした。



しかし、歎史はその調敎を行い、しばしば非垞に予想倖です。 この囜で最も人気のある゜ヌシャルネットワヌクであるプロゞェクトMy Worldがカザフスタンで非垞に人気があるこずは呚知の事実です。 そしお、私たちは垞に、カザフ語ナヌザヌに、拡匵キリル文字セットのカザフ語アルファベットの文字を䜿甚する機䌚を䞎えたいず考えおいたした。残念ながら、CP1251で堎所を芋぀けるこずができたせんでした。 そしお、長期的な開発を最終的に正圓化するこずができた、私たちにずっおの远加のむンセンティブは、囜倖でのプロゞェクトの人気のさらなる成長でした。 私たちは、倖囜人ナヌザヌに向けお䞀歩を螏み出す時だず実感したした。



もちろん、プロゞェクトの囜際化に必芁な最初のこずは、デヌタの受信、送信、凊理、およびUTF-8での保存を開始するこずでした。 倧芏暡プロゞェクトでのこの手順は、話そうずするいく぀かのかなり興味深い問題を解決しなければならなかった方法に沿っお、単玔で長くはありたせん。



デヌタベヌス倉換

最初に出䌚った遞択肢は、かなり暙準的なものでした-ペヌゞの衚瀺から、たたはデヌタストレヌゞから。 これは最も時間のかかるプロセスであり、開発者ず管理者による調敎されたアクションを必芁ずするため、リポゞトリから始めるこずにしたした。



私たちの゜ヌシャルネットワヌクでは、速床の理由から、倚数のさたざたな専甚リポゞトリが䜿甚されおいるため、状況は耇雑でした。 もちろん、それらのすべおに囜際化の察象ずなるテキストフィヌルドが含たれおいるわけではありたせんが、それでも倚くのテキストフィヌルドがありたした。 そしお、最初に行わなければならなかったのは、リポゞトリ内のテキスト文字列のコンテンツに぀いお、すべおのリポゞトリの完党なむンベントリを実斜するこずでした。 確かに、私たちは倚くのこずを孊びたした。



MySQL

MySQLでストレヌゞをUTF-8に倉換し始めたした。 この理由は、䞀般に、このベヌスの゚ンコヌディングの倉曎がネむティブにサポヌトされるずいう事実でした。 しかし実際には、すべおがそれほど単玔ではありたせんでした。



たず、倉換䞭はダりンタむムなしでデヌタベヌスを倉換する必芁がありたした。



第二に、すべおのテヌブルで、 テヌブル `my_table`を文字セットutf8に倉換するように倉曎するこずが刀明したした。 合理的ではなく、さらに䞍可胜です。 フィヌルドにASCII文字のみが含たれおいる堎合でも、UTF-8フィヌルドのむンデックスは垞に3 * length_in_charactersバむトを芁するため、合理的ではありたせん。 そしお、むンデックスフィヌルド、特に16進文字列を含むフィヌルドなど、このようなフィヌルドがたくさんありたした。 MySQLのむンデックスキヌの最倧長は767バむトであり、むンデックス特に耇数列のむンデックスが適合しないため、䞍可胜です。 さらに、堎所によっおはバむナリデヌタが誀っお堎所に保存されたり、その逆の堎合もあり、各フィヌルドを慎重にチェックする必芁があるこずがわかっおいたす。



そこで利甚可胜なテヌブルに関するデヌタベヌスから情報を収集した埌、それらの倧郚分がほずんど䜿甚されおいないこずが明らかになりたした。 結果ずしお、デヌタベヌス内のすべおのテヌブルの玄半分をデヌタベヌスから削陀したした。 未䜿甚のテヌブルを芋぀けるために、次の手法を䜿甚したしたtcpdumpを䜿甚しお、1日でデヌタベヌスぞのすべおのク゚リを収集し、このダンプのテヌブルのリストを珟圚のデヌタベヌススキヌムず亀差させ、念のため、コヌドで未䜿甚のテヌブルを怜玢したした同時にコヌドをクリアしたした。 Tcpdumpは、MySQLツヌルを䜿甚しおすべおのリク゚ストをログに曞き蟌むのずは異なり、デヌタベヌスの再起動を必芁ずせず、リク゚スト凊理の速床に圱響を䞎えないため、䜿甚されたした。 もちろん、テヌブルをすぐに削陀するのは怖いので、最初は特別なサフィックスを付けおテヌブルの名前を倉曎し、数週間埅っおから削陀したした理由は、正圓な理由で再保険されおいたため、いく぀かの䜙分な未䜿甚のテヌブルが過倱によっおフックされ、返品する必芁がありたした。



次に、デヌタベヌス倉換甚のDDLの䜜成を開始したした。 このために、いく぀かの暙準パタヌンが䜿甚されたした。



倉換時のダりンタむムなしでベヌスをUTF-8に倉換するタスクは、通垞の方法、぀たりレプリカを䜿甚しお解決されたした。 しかし、機胜なしではありたせん。 たず、りィザヌドからレプリカを取埗するずきに文字列が自動的に倉換されるようにするには、 ステヌトメントモヌドでレプリケヌションが必須であるこずが必芁です。rawモヌドでは、倉換は実行されたせん。 次に、 ステヌトメントレプリケヌションに切り替えるには、 トランザクション分離レベルをデフォルトの反埩可胜読み取りからコミットの 読み取りに倉曎する必芁もありたす。



実際に次のように倉換されたす。

  1. りィザヌドをステヌトメント耇補モヌドに切り替えたす。
  2. 倉換のためにデヌタベヌスの䞀時コピヌを䜜成し、その䞊で倉換を実行したす。
  3. 倉換の最埌に、メむンデヌタベヌスからレプリカモヌドにコピヌを転送したす。デヌタが远い぀き、行もその堎で倉換されたす。
  4. 各レプリカベヌスに぀いお

    -負荷をレプリカから䞀時レプリカにUTF-8で転送したす。

    -すべおのレプリカを䞀時ベヌスかられロから転送し、そこから耇補を有効にしたす。

    -負荷をレプリカに戻したす。
  5. 䞀時ベヌスをりィザヌドモヌドに転送し、NATを䜿甚しお叀いマスタヌから䞀時マスタヌに芁求を転送したす。
  6. 叀いマスタヌをタむムベヌスから転送し、レプリケヌションに远い぀きたす。
  7. マスタヌを元に戻し、NATを削陀し、レプリケヌションを混合に戻したす。
  8. 䞀時ベヌスを無効にしたす。


その結果、3か月間の骚の折れる䜜業で、15個の異なるベヌススキヌムで98個すべおのマスタヌおよびレプリカの束を倉換するこずができたした特に倧きな1぀の750GBベヌスがほが2週間のマシン時間で倉換されたした。 管理者は泣き、倜は眠れたせんでした開発者に眠らせないこずもありたしたが、それでも私たちが望むほど速くはないプロセスが続いた。 最初に、圌らは最善を望み、䞊蚘のスキヌムに埓っお倉換を実行したした;プロセスをスピヌドアップするために、圌らはSSDディスクを搭茉したマシンを䜿甚したした。 しかし、3か月目の終わりに、この状況ではさらに2か月が必芁であるこずに気付き、圌らはそれに耐えられず、負荷党䜓をレプリカからマスタヌに転送し、叀いレプリカに盎接倉換し始めたした。 幞いなこずに、この期間䞭にマスタヌで異垞な状況は発生せず、1週間以内に䞻にレプリカがかなり匱い叀い車で回転しおいたため、倉換は完了したした。



デヌタベヌス自䜓の倉換に加えお、コヌドでUTF-8のサポヌトを取埗し、スムヌズで目立たない移行を保蚌するこずも必芁でした。 ただし、MySQLではすべおが簡単です。 事実、圌はデヌタを保存する個別の゚ンコヌディングず、クラむアントにデヌタを提䟛する個別の゚ンコヌディングを持っおいたす。 歎史的に、サヌバヌ䞊では、 character_set_ * = cp1251ず曞かれおいたした 。 パラメヌタcharacter_set_client、character_set_connection、character_set_resultsに぀いおは、叀いクラむアントを壊さないように䜕も倉曎せず、cp1251を残したした。 残りはutf8に眮き換えられたした。 その結果、cp1251で動䜜する叀いクラむアントは、デヌタベヌスが倉換されおいるかどうかに関係なくcp1251でデヌタを受信し、接続を確立した埌、UTF-8で動䜜する新しいクラむアントはすぐにset names utf8コマンドを実行したす; この゚ンコヌドのすべおの利点を䜿甚し始めたす。



タランツヌル

タランチュラずは䜕なのか、もうわかりたせん。 このMy Worldの発案はすでに十分な名声を埗おおり、優れたオヌプン゜ヌスプロゞェクトに成長しおいたす。



その䜿甚の長幎にわたっお、私たちはその䞭に膚倧な量の情報を蓄積するこずができたした。そしお、タランチュラのむンスタンスが400個あるこずが刀明したずき、率盎に蚀っお、倉換に時間がかかるのは怖かったです。 しかし、幞いなこずに、そのうち60のみがテキストフィヌルド䞻にナヌザヌプロファむルを持っおいるこずがわかりたした。



確かに、タランチュラのトランスコヌディングは非垞に興味深いタスクであるこずが刀明したした。 そしお、解決策は非垞に゚レガントでした。 しかし、もちろん、完党にそのたたではありたせん。 タランツヌルがオヌプン゜ヌスプロゞェクトずしお開発を始めた埌、コミュニティず私たちのニヌズはわずかに異なるこずが刀明したずいう歎史的な事実をすぐに確認したす。 コミュニティには、わかりやすい補品、すぐに䜿えるキヌバリュヌストレヌゞが必芁ですが、モゞュラヌアヌキテクチャストレヌゞを曞き蟌むためのフレヌムワヌク、高床に特殊化された远加機胜、パフォヌマンス最適化を備えた補品が必芁です。 そのため、どこかでタランツヌルを䜿い続け、どこかで最初のタランチュラの䜜者が開発したフォヌクタコを䜿い始めたした。 これにより、倉換プロセスが倧幅に簡玠化されたした。 実際、タコではluaに耇補フィルタヌを曞き蟌むこずができたす。぀たり、りィザヌドのスナップショットずxlogから元のコマンドを送信するのではなく、lua関数を䜿甚しお倉曎を通過したす。 この機胜は、マスタヌからのすべおのデヌタではなく、特定のタプルフィヌルドのみを含む郚分レプリカを䜜成できるようにするために、かなり前に远加されたした。 そしお、私たちは同じ方法で、耇補のプロセスでその堎でテキストをトランスコヌドできるずいう考えを埗たした。



それでも、このタスクのタコはわずかに終了する必芁がありたした フィヌダヌ xlogレプリカを䟛絊するりィザヌドプロセスは長い間別個のタコモゞュヌルmod_feederずしお実装されおきたしたが、ストレヌゞなしでは個別に起動できたせんでしたこの堎合、 キヌ - mod_boxモゞュヌルによっお実装された倀。これは、レプリケヌションメカニズムの倉曎がりィザヌドの再起動を必芁ずしないようにするために必芁でした。 もちろん、私はluaでレプリケヌションフィルタヌを䜜成する必芁がありたした。これは、名前空間ごずに必芁なフィヌルドをCP1251からUTF-8に倉換したした。



タランチュラずタコで実際にデヌタを倉換するこずに加えお、ただ倉換されおいるがただ倉換されおいないシャヌドを䜿甚しおコヌドの透過的な動䜜を確保するずずもに、CP1251での䜜業からUTF-8での䜜業ぞのアトミックスむッチングを提䟛する必芁がありたした。 そのため、ストレヌゞの前に特別なトランスコヌディングプロキシを配眮するこずが決定されたした。これは、クラむアントのリク゚ストのフラグに応じお、ベヌス゚ンコヌディングからクラむアント゚ンコヌディングにデヌタを倉換したす。 ここで、タコが再び私たちの助けになりたした。たたは、 mod_colanderモゞュヌルを䜿甚するず、luaを含む高速プロキシサヌバヌを䜜成できたすタコはluajitずffiを䜿甚するため、非垞に生産的です。



合蚈で、tarantool / octopusからUTF-8ぞの倉換スキヌムは次のずおりです。

  1. マスタヌずレプリカでutf8proxyを構成したす。 タランチュラが以前聞いおいた枯でそれを䞊げ、別の枯にタランチュラ自身を再蚭眮したす。 これ以降、クラむアントはCP1251ずUTF-8の䞡方で芁求を満たすこずができたす。
  2. りィザヌドを備えたサヌバヌで、倉換utf8feederを実行し、りィザヌドが曞き蟌む同じディレクトリからスナップショットずxlogを読み取るように構成したす。
  3. 別のサヌバヌでは、りィザヌドの䞀時的なレプリカを䜜成し、倉換䞭のフィヌダヌから耇補するように構成したす。 デヌタは、UTF-8゚ンコヌディングで䞀時的なレプリカにすでに到着しおいたす。
  4. 䞀時レプリカから耇補するように構成したutf8proxyレプリカ、䞀時レプリカから叀いレプリカを転送しおから、負荷を戻したす。
  5. ポヌトをutf8proxyマスタヌにファむアりォヌルし曎新に競合がないように、 utf8proxyを䞀時レプリカに再構成し、䞀時レプリカを䞀時マスタヌにし、叀いマスタヌを消滅させ、ポヌトをutf8proxyに起動したす。
  6. 新しいマスタヌを䞀時的なマスタヌから転送し、レプリカを耇補に切り替えたす。
  7. utf8proxyを䜿甚しお、新しいマスタヌをマスタヌにし、䞀時マスタヌをオフにしたす。 このステップでは、すべおのむンスタンスにUTF-8のデヌタが含たれおいるため、クラむアントから非キリル文字のテキストの曞き蟌みを開始できたす。
  8. すべおのクラむアントがUTF-8に移行した埌、 utf8proxyを削陀したす。








タランチュラ/タコのトランスコヌドのプロセス党䜓に玄1か月かかりたした。 残念ながら、いく぀かのオヌバヌレむがありたした。耇数のシャヌドを䞊行しお倉換したため、マスタヌを戻すずきに2぀のシャヌドを所定の堎所で混圚させるこずができたした。 問題が発芋されるたでに、かなりの量のデヌタ倉曎がすでに発生しおいたした。 䞡方のシャヌドからのxlogを分析し、正矩を回埩する必芁がありたした。



Memcached

䞀芋、キャッシュの倉換が最も簡単だず思われたすいずれにせよ、最初はそうでした別の名前のキヌにUTF-8を曞き蟌むか、他のむンスタンスに曞き蟌みたす。 しかし、実際にはこれはうたくいきたせん。 これには2぀の理由がありたす。1぀目は、2倍のキャッシュが必芁になるこず、2぀目は、゚ンコヌドを切り替えるずきにキャッシュが非加熱になるこずです。 耇数のサヌバヌ間でスムヌズに切り替えるこずで2番目の問題に察凊できる堎合、倚数のキャッシュがある堎合、最初の問題ははるかに耇雑になりたす。



そのため、各キヌに、そのキヌが栌玍されおいる゚ンコヌディングに関するフラグを立おるずいうパスをたどりたした。 さらに、 キャッシュのパヌルクラむアント:: Memcached :: Fast memcacheには既にこの機胜がありたす キヌフラグ  F_UTF8 = 0x4 の1぀でmemcacheに行を保存するずき、 SVf_UTF8行の内郚パヌルフラグを曞き蟌みたす。 。 したがっお、フラグが蚭定されおいる堎合、行はUTF-8で明確になり、そうでない堎合、すべおが少し耇雑になりたす。この行はCP1251のテキストたたはバむナリのいずれかです。 もちろん、必芁に応じおテキスト文字列を倉換したすが、バむナリに問題がありたした䞍必芁な倉換でそれらを壊さないために、テキスト文字列ずバむナリのset / getなどメ゜ッドを分離し、memcachedに保存されたすべおのバむナリ文字列を芋぀け、それらを受け取り、自動トランスコヌディングなしで適切な方法に眮き換えたす。 同じコヌドがシッシュコヌドに適甚され、 F_UTF8フラグのサポヌトが远加されたした。



その他のリポゞトリ

前述の暙準リポゞトリに加えお、「新機胜」のテヌプ、コメント、メッセヌゞキュヌ、ダむアログ、怜玢などを保存するために䜿甚される膚倧な数の自己蚘述型リポゞトリを䜿甚したす。 それぞれに぀いお詳しく説明するのではなく、䞻なケヌスずそれらを解決する方法にのみ泚目したす。

  1. ダりンタむムなしでストレヌゞを倉換するこずは困難です。たたは、すぐに新しいストレヌゞにデヌタを転送するか、寿呜の短いデヌタを転送する予定です。 そのような堎合、デヌタは倉換されたせんでしたが、新しいレコヌドには、レコヌド党䜓がどの゚ンコヌディングに含たれおいるかを瀺すフラグを䜿甚するか、UTF-8の堎合は各文字列フィヌルドの先頭にBOMマヌカヌを䜿甚するずいう2぀の方法のいずれかで゚ンコヌディング蚘号が付けられたした。
  2. 行自䜓がリポゞトリに保存されるのではなく、それらからのハッシュ合蚈が保存されたす。 怜玢のために䜿甚されたす。 圌らは、UTF-8に倉換された元の文字列からハッシュ合蚈を再レンダリングするスクリプトを䜿甚しお、リポゞトリ党䜓を歩き回りたした。 倉換時には、各怜玢ク゚リに察しおデヌタベヌスぞの2぀のク゚リを実行する必芁がありたした。1぀はCP1251で、もう1぀はUTF-8です。
  3. リポゞトリの前にプロキシが既にむンストヌルされおおり、リポゞトリぞのすべおのリク゚ストはプロキシを通過したす。 この堎合、タランチュラの堎合ず同様にプロキシに倉換されたすが、タランチュラの䞀時的な機胜である堎合、唯䞀の違いは、この堎合、デヌタベヌスに保存されおいるデヌタが関連するたで残るこずです。


コヌドでのUTF-8サポヌト

管理者がデヌタベヌスを倉換する方法ず䞊行しお、開発者はコヌドをUTF-8゚ンコヌディングで動䜜するように適合させたした。 コヌドベヌス党䜓は、Perl、C、テンプレヌトの3぀の郚分に条件付きで分割されおいたす。



プロゞェクトをUTF-8゚ンコヌディングに切り替える手順を蚭蚈する際の重芁な芁件の1぀は、1぀のサヌバヌを切り替える機胜でした。 たず、これは、最初にテスタヌの努力によっお、次にナヌザヌの数パヌセントによっお、戊闘ベヌスを䜿甚しおUTF-8でプロゞェクトをテストする可胜性を確保するために必芁でした。



PerlおよびUTF-8

UTF-8で動䜜するようにパヌルコヌドを適合させるには、いく぀かの基本的な問題を解決する必芁がありたした。



パヌルコヌドをCP1251からUTF-8に倉換するずいうタスクをやや非自明な方法で解決したしたフィルタヌを䜿甚しおコンパむルするずきに、その堎でモゞュヌルを倉換するこずから始めたした perlfilterおよびFilter :: Util :: Callを参照しおください。ディスクずコンパむル。 これは、リポゞトリブランチのマヌゞ䞭に耇数の競合を回避するために必芁でした。これは、1぀の別個のブランチでレポゞトリを倉換し、開発およびテストプロセス䞭に保管しようずした堎合に発生したす。 テストプロセス党䜓ず起動埌最初の1週間、サヌバヌがUTF-8ずしお構成されおいる堎合、゜ヌスコヌドは匕き続きCP1251に残り、デヌモンの起動時にバトルサヌバヌで盎接倉換されたした。 ロヌンチの1週間埌、リポゞトリを倉換し、すぐにマスタヌで結果を凍結したした。 その結果、マヌゞずの競合は、この時点で開発䞭だったブランチでのみ発生したした。



最もルヌチンは、UTF-8党䜓に倉換しなかったストレヌゞの自動文字列倉換を必芁なすべおの堎所に远加するプロセスでした。 しかし、真珠での文字列倉換が䞍芁な堎合でも、真珠ではバむト文字列ず文字列の間に差があるそしお重芁なこずを考慮する必芁がありたした。 もちろん、デヌタベヌスから読み取った埌、すべおのテキスト行を自動的にシンボリックにしたかったため、バむナリデヌタが転送されるかテキストであるかに぀いおすべおの入力/出力を分析する必芁があり、すべおの必芁な行をunpackedずしおマヌクするためにpack / unpackのすべおの呌び出しを実行する必芁がありたしたシンボリックたたはパッケヌゞを䜜成する前に、文字列バむトを䜜成しお、長さを文字ではなくバむトでカりントする。



HTTPリク゚ストパラメヌタがCP1251たたはUTF-8リファラヌペヌゞが読み蟌たれた゚ンコヌディングに応じおに来るずいう事実の問題は、リク゚ストで远加のパラメヌタを枡すこずで最初に解決するこずが望たれおいたした。 しかし、その埌、CP1251ずUTF-8がどのように゚ンコヌドされおいるかを分析した埌、文字列が有効なUTF-8であるかどうかをチェックするこずで、CP1251のキリル文字ずUTF-8のキリル文字を垞に明確に区別できるずいう結論に達したしたCP1251では、有効なUTF-8をコンパむルするこずはほずんど䞍可胜です。



䞀般に、UTF-8での䜜業が真珠で組織化される方法は、非垞に䟿利ではありたすが、それでも魔法であるこずが倚く、次のこずに留意する必芁がありたす。



CおよびUTF-8

幞いなこずに、Cコヌドには真珠ほど倚くの行がありたせんでしたので、叀兞的な道を歩きたした。すべおのキリル行を別のファむルに取りたした。 これにより、単䞀ファむル内のマヌゞずの朜圚的な競合を制限するこずができ、その埌のロヌカラむズも簡玠化されたした。 リポゞトリをUTF-8に倉換する過皋で、圌らは䜕か面癜いものを芋぀けたした-コヌド内のロシア語のコメントは、4぀のキリル文字゚ンコヌドcp1251、cp866、koi8-r、iso8859-5に含たれおいたした。 倉換䞭に特定の各行の゚ンコヌディングの自動怜出を䜿甚する必芁がありたした。



リポゞトリの倉換に加えお、Cは基本的な文字列関数のサポヌトも必芁ずしたした文字の長さの決定、レゞスタのキャスト、長さによる文字列のトリミングなど。CでUnicodeを操䜜するためのすばらしいlibicuラむブラリがありたすが、内郚衚珟ずしおUTF-16を䜿甚したす。 もちろん、UTF-8ずUTF-16の間のトランスコヌディングのオヌバヌヘッドを回避したかったため、最も䞀般的に䜿甚される単玔な関数では、トランスコヌディングなしでUTF-8で盎接動䜜するアナログを実装する必芁がありたした。



テンプレヌト、javascriptおよびUTF-8

幞いなこずに、テンプレヌトを䜿甚するず、すべおが非垞にシンプルになりたした。 本番環境では、これらはrpmパッケヌゞに配眮されおいるため、論理的な解決策はトランスコヌドをrpmビルドプロセスにカットするこずでした。 UTF-8のテンプレヌトを含むパッケヌゞをもう1぀远加したした。これは隣接するディレクトリにむンストヌルされ、その埌コヌドpearlずsylvianの䞡方は察応するディレクトリからテンプレヌトを遞択したした。



JavaScriptを䜿甚するず、そのたたでは機胜したせんでした。 JavaScriptをロヌドするずき、ほずんどのブラりザヌはそのContent-Typeを考慮したすが、そうでない叀いむンスタンスがいく぀かありたすが、ペヌゞ゚ンコヌディングに焊点を圓おおいたす。 したがっお、圌らは束葉杖を眮きたすjavascriptでパッケヌゞを構築するずき、すべおの非ASCII文字をコヌドポむント番号の圢匏の゚スケヌプシヌケンスに眮き換えたした。 このアプロヌチでは、jsのサむズは倧きくなりたすが、ブラりザヌはそれを正しくロヌドしたす。



結果は䜕ですか

最埌に、半幎埌、゜リティアは䞀緒になりたした。 管理者は数癟のデヌタベヌスの再コヌディングを完了し、開発者はコヌドを終了し、テストプロセスも終了したした。 ワヌルドコントロヌルパネルのノブを埐々に切り替えたした。たず、同僚のすべおのアカりントがUTF-8に転送され、次にナヌザヌの1が転送され、その埌バック゚ンドサヌバヌず10台のフロント゚ンドサヌバヌをそれぞれ10サヌバヌず぀切り替え始めたした。 芖芚的には、プロゞェクトペヌゞもロヌドスケゞュヌルも倉曎されず、喜ばずにはいられたせんでした。 理由なく半幎が経過したこずが明らかになった唯䞀の倖郚の倉曎は、 char- set = windows-1251のContent-Type行をcharset = UTF-8に倉曎したこずです。



それから3か月が経ち、ロシア語を話すナヌザヌはすでにテキストに絵文字やその他のささいなこずを挿入する機胜を高く評䟡しおおり、カザフ語は母囜語で察応し始め、最近ではりェブむンタヌフェむスずモバむルアプリケヌションを母囜語で䜿甚する機䌚がありたす。 unicode'izationに続くプロゞェクトの囜際化ずロヌカリれヌションのプロセスには、興味深いタスクが十分にありたした。これに぀いおは別の蚘事を䜜成するようにしたす。



All Articles