atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
FPSを作ってみる@wiki
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
FPSを作ってみる@wiki
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
FPSを作ってみる@wiki
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • FPSを作ってみる@wiki
  • 進捗状況(2011
  • 05)

FPSを作ってみる@wiki

05)

最終更新:2011年05月29日 17:58

slice

- view
管理者のみ編集可

(2011/05/29)

Unicode対応完了

変換プログラムを作った後にふと「メインプログラムもunicode対応しておこうか」と思い立ってしまったのでそれをしていた.
こんなカスのようなプログラムでもそれなりコード量があって
想像だけでおなか一杯だが何時かはやらねばならんのだ.
というかShiftJIS版Luaを使わずに行くと決めた時点でunicode対応は必須事項.

最初unicode対応と聞いてプログラム中の文字列を全部wchar_t型に置き換えるのかと勝手に決めつけ
ソースコード中の文字列をひたすら_T()で括りstd::stringはtstring(※1)に,その他ルーチンを対応の物に置き換えていたのだが
実際そんな単純な話ではない.例えば
XMLパーサのxercesライブラリは元々内部表現としてunicodeを使用している為にANSIから変換するコードが不要になるし
HLSLのクラスであるD3DXEFFECTはメソッド引数にANSIしか受け付けない(※2).
Luaとやり取りする文字列に関してもシステム定数なんかの
「アルファベットと数字だけと分かっている」文字列はどちらにせよASCIIコードの範囲内だから
unicodeで定義する必要はない(というよりASCII文字だけの場合はUTF-8にしようがコードは同一であるからむしろcharのままが自然)

他にはBOM(Byte Order Mark)のスキップやら対応してないエンコードを弾くなどの処理も必要だがこんな所である.
ちなみにunicodeは仕様上最初の2バイトは必ずASCII文字であるので最初の4バイトを見ればUTFの何でエンコードされているか判別可能だ.

そもそもなぜunicode対応(UTF-16)をするのかといえば
  • WindowsAPIの内部表現がそうなっているから(ANSIだと都度変換がかかる)
  • 日本語の扱いを簡単にする(全角も半角も同じ2バイトだから扱いが楽.ShiftJISのような2バイト目にバックスラッシュと同じコードが入って不具合を起こす事も無い)
だった.
しかしその後の調査で1番目はともかく2番目に関しては1文字につき基本2バイトだけど4バイトの文字(サロゲートペア)もある事がわかって利点が半分崩れる格好となった.
LuaからC++に渡した日本語の文字化け回避くらいしかこれといった利点が・・・(※3)

※1 UNICODEがdefineしてあるかで分岐して std::string か std::wstring をtstringとしてtypedefした物.
※2 そもそもHLSLのコンパイラからしてunicodeに非対応,MSDNを見るに文字列型も仕様的にASCIIオンリーとしてある.
※3 しかし同じunicodeといってもExeで扱う形式はUTF-16,LuaはUTF-8なのでASCIIなら無変換で渡せるのに対しUTF-16では変換の手間があるという中途半端さ
~続く~

(visual studioで「unicode文字セットを使う」を選ぶと何が変わるの?という疑問が浮かんだので
調べたらUNICODEがdefineされるか否かだけらしい.なんとまぁ・・)

(2011/05/24)#2

サロゲートペア

前回でUTF-8ならばluaでunicodeを扱えそうだという事がわかり,
じゃあ早速UTF-8とUTF-16を相互に変換するルーチンをググって探して組み込めば良いだろう.
と思いきや,暫しググった後
ふと「そんな細いの探すのも面倒だし元々相互変換しやすく設計されたんだからちゃっちゃと表を見ながら作ればいいのでは?」
(unicodeの理解を深める為にも!)
そんな考えが浮かんだ.
実際やってみたら割とアッサリ出来た.

んで折角作るのだからとサロゲートペアにも対応してみた・・・が.BMPに含まれない文字は,少なくともwindowsXPにおいて
付属のメモ帳はともかくvisual studioでさえ「・」や「□」(適切なフォントが見当たらない時の表示)になってしまい少々調子が狂う.
これはファイルに保存する文字コードをUTF-8に設定しても変わらない.インターネットエクスプローラも駄目だ.
しかしFireFoxでは普通に入力可能.結局アプリケーションに依るところが大きい.

XPの内部表現がサロゲートペアに対応してないという事なんだろうか.
まだXPで頑張るつもりの自分としてはなんとも残念な話だがVista以降は大丈夫でしょうな?

(2011/05/24)

LuaとUnicode

そういやluaってunicode対応してたっけなぁと思い,調べたり.
ソースコードをどの文字コードで書いたらOKなの?とか.
結論から言えばUTF-8でソースを書き動作させるのは可能である.

独自にShiftJIS対応したバージョンを開発して配布してる人も居るようだが
本家luaがバージョンアップした時にまたShiftJISバージョンまで待たされるのもアレだ(というか出る保証もないし).
そんな訳で本家バージョンを使いつつなんとかする方向で行く.

で,"lua unicode"などのキーワードでググって出てきたページでは
8bit目は問題なく処理するから対応してるどうのこうのとか小難しく言ってたが
平たく言えばluaは
  • マルチバイト文字には対応してない
  • 文字列はそのままバイト列として扱うから(0x00で終わってさえいれば)中身は関係ない
そしてUTF-8の特徴は
  • ASCIIコードと互換性がある
  • 文字の2バイト目以降はASCIIコードが現れない
である.
この事からUTF-8でソースを書く事はコメントと文字列定数以外ASCIIで書くのと同義である.
文字列は先述した通りバイト列として扱われ,終端文字もASCII(=0x00)であるのでこれも問題ない.
コメント文についても閉じタグがASCIIなので(以下略)

luaのソースがUTF-8で書けるというのはそういう事のようだ.
基本的にソースコードをUTF-8で保存するだけでunicodeに対応できるが
当然luaから送られてくる文字列はUTF-8なので文字列表現にUTF-16を用いるユーザープログラム側で
変換をかまさなければならない.
こうなるとゲームでの処理負荷が気になる所だが所詮は文字列.何百回もループするわけでなし気にしない事にする.

(2011/05/16)

Unicode

ファイルパッキング自体は完了.ついでにUnicode対応もしてみた.
何故今までしてなかったかというと
VC++でUnicode文字セットを使う設定にすると文字列の型がchar(1バイト)からwchar_t(2バイト)となるのだが
ネットで調べるとUTF-8は1~4バイトだとか,UTF-16は2or4バイトだとか書いてあり
1文字2バイトにしたところでどうなんだと,合点がいかなかったからだ.

更にUTFはUTFでもUnicode Transformation Formatや, UCS Transformation Formatの略でもあるとかで
自分がUTF-8で調べて文字長が1~4なのと1~6なのとで混乱したのはこれの違いだった.
え?UnicodeとUCSは違うの?どうやら少し違うらしい.訳がわからん.貴様らDVD+Rと-Rか.
(コンピュータ関連各社が参加するユニコードコンソーシアムで制定されたのがUnicodeで
後にISOが国際規格として標準化したのがUCSのようだ.
当初は世界中の文字を1つの文字コードに統一する目的で別々に動いていたが途中で歩調を合わせるようになり云々・・)

個人的な理解は
Unicodeで定義された文字全てを表すには21ビット必要でそれを満たしCPUにとって扱いやすいサイズは32ビット(4バイト)である.
4バイトを1文字とする形式はUTF-32と呼ばれる.
基本多言語面(BMP, Basic Multilingual Plane)は2バイト,それ以外は4バイトで表すのがUTF-16.
ASCII文字を主に使うケースにおいてアルファベット1つに2バイト使っていたのでは無駄が大きすぎるという事で生まれたのが(多分)
ASCIIコードの0x00~0x7fの範囲は互換性を持たせそれ以外の文字を1~4バイトの可変長で表すUTF-8.
UTF-16を7ビット単位でしかデータを扱えない環境(メール送信とか?)でUnicode文字を送受信する場合にBase64などで細工をかました形式がUTF-7.
またUTF-32とUTF-16にはそれぞれリトルエンディアンとビッグエンディアンの両方が存在しUTF-32LE,UTF-32BEと表記したりする.
とまぁそんなところである.

話が長くなったが
windowsXPで使われるUnicodeはUTF-16LE.単にUnicodeといえばUTF-16を指す事が多い.
UTF-16は2or4バイトなので結局文字列処理の複雑さがShiftJISとかと変わらん気もしたが通常
BMPは2バイトで表される為に,特にゲームでは無視しても大丈夫なのだろう.
でも「鮭(サケ)」は2バイトだけど「
「05)」をウィキ内検索
LINE
シェア
Tweet
添付ファイル
  • 89_3.jpg
FPSを作ってみる@wiki
記事メニュー
  • トップページ
  • 参考資料ブックマーク等
  • Tips

Media

  • 頂き物
Screen shot
  • FPS_page1
  • FPS_page2
  • FPS_page3
  • Other_page1
Drawing
  • Drawing(analog)
  • Drawing(digital)
  • Drawing(digital) 2
  • Drawing(digital) 3
  • Drawing(digital) 4
  • Drawing(digital) 5
  • Drawing(digital) 6
  • Drawing(digital) 7
  • Drawing(digital) 8
  • Drawing(digital) 9
  • Drawing(digital) 10
  • Drawing(digital) 11
  • Drawing(digital) 12
  • Drawing(digital) 13
Movie
  • movies-list

Old Contents

  • トップページ(old)
  • メモ書き
  • 力仕事UP場
  • ゲームシステムとか
  • バグ・動作報告
  • program(twilve)

Progress log

  • (2018/03)
  • (2017/04)
  • (2017/03)
  • (2016/10)
  • (2016/09)
  • (2016/08)
  • (2016/07)
  • (2016/06)
  • (2016/05)
  • (2016/04)
  • (2016/03)
  • (2016/02)
  • (2016/01)
  • (2015/12)
  • (2015/11)
  • (2015/10)
  • (2015/09)
  • (2015/08)
  • (2015/07)
  • (2015/06)
  • (2015/05)
  • (2015/04)
  • (2015/03)
  • (2015/02)
  • (2015/01)
  • (2014/12)
  • (2014/11)
  • (2014/10)
  • (2014/09)
  • (2014/08)
  • (2014/07)
  • (2014/06)
  • (2014/05)
  • (2014/04)
  • (2014/03)
  • (2014/02)
  • (2014/01)
  • (2013/12)
  • (2013/11)
  • (2013/10)
  • (2013/09)
  • (2013/08)
  • (2013/07)
  • (2013/06)
  • (2013/05)
  • (2013/04)
  • (2013/03)
  • (2013/02)
  • (2013/01)
  • (2012/12)
  • (2012/11)
  • (2012/10)
  • (2012/09)
  • (2012/08)
  • (2012/07)
  • (2012/06)
  • (2012/05)
  • (2012/04)
  • (2012/03)
  • (2012/02)
  • (2012/01)
  • (2011/12)
  • (2011/11)
  • (2011/10)
  • (2011/09)
  • (2011/08)
  • (2011/07)
  • (2011/06)
  • (2011/05)
  • (2011/04)
  • (2011/03)
  • (2011/02)
  • (2011/01)
  • (2010/12)
  • (2010/11)
  • (2010/10)
  • (2010/09)
  • (2010/08)
  • (2010/07)
  • (2010/06)
  • (2010/05)
  • (2010/04)
  • (2010/03)
  • (2010/02)
  • (2010/01)
  • (2009/12)
  • (2009/11)
  • (2009/10)
  • (2009/09)
  • (2009/08)
  • (2009/07)
  • (2009/06)
  • (2009/05)
  • (2009/04)
  • (2009/03)
  • (2009/02)
  • (2009/01)
  • (2008/12)
  • (2008/11)
  • (2008/10)
  • (2008/09)
  • (2008/08)
  • (2008/07)
  • (2008/06)
  • (2008/05)
  • (2008/04)



記事メニュー2

Update Log

取得中です。
人気記事ランキング
  1. Drawing_analog
もっと見る
最近更新されたページ
  • 2686日前

    menu_L
  • 2686日前

    進捗状況(2018/03)
  • 2686日前

    Drawing_digital_13
  • 2686日前

    Drawing_digital_12
  • 2686日前

    トップページ
  • 2892日前

    Drawing_digital_11
  • 2973日前

    Drawing_digital_10
  • 3005日前

    進捗状況(2017/04)
  • 3046日前

    進捗状況(2017/03)
  • 3097日前

    頂き物
もっと見る
人気記事ランキング
  1. Drawing_analog
もっと見る
最近更新されたページ
  • 2686日前

    menu_L
  • 2686日前

    進捗状況(2018/03)
  • 2686日前

    Drawing_digital_13
  • 2686日前

    Drawing_digital_12
  • 2686日前

    トップページ
  • 2892日前

    Drawing_digital_11
  • 2973日前

    Drawing_digital_10
  • 3005日前

    進捗状況(2017/04)
  • 3046日前

    進捗状況(2017/03)
  • 3097日前

    頂き物
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. MadTown GTA (Beta) まとめウィキ
  2. AviUtl2のWiki
  3. R.E.P.O. 日本語解説Wiki
  4. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  5. シュガードール情報まとめウィキ
  6. ソードランページ @ 非公式wiki
  7. ドラゴンボール Sparking! ZERO 攻略Wiki
  8. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  9. 星飼いの詩@ ウィキ
  10. Dark War Survival攻略
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 検索してはいけない言葉 @ ウィキ
  6. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  7. 発車メロディーwiki
  8. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  9. オレカバトル アプリ版 @ ウィキ
  10. SDガンダム ジージェネレーションジェネシス 攻略Wiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 過去の行動&発言まとめ - 鹿乃つの氏 周辺注意喚起@ウィキ
  2. マイティーストライクフリーダムガンダム - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  3. 魚拓まとめ - 鹿乃つの氏 周辺注意喚起@ウィキ
  4. 参加者一覧 - ストグラ まとめ @ウィキ
  5. 1103環境(遊戯王) - アニヲタWiki(仮)
  6. 前作からの変更点 - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  8. コレクター・ユイ - アニヲタWiki(仮)
  9. サーヴァント/一覧/クラス別 - Fate/Grand Order @wiki 【FGO】
  10. 画像倉庫 - 鹿乃つの氏 周辺注意喚起@ウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.