Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ユーザー名に日本語を許容する #4

Closed
yu-tang opened this issue Apr 28, 2011 · 6 comments
Closed

ユーザー名に日本語を許容する #4

yu-tang opened this issue Apr 28, 2011 · 6 comments
Assignees

Comments

@yu-tang
Copy link
Owner

yu-tang commented Apr 28, 2011

現状

オリジナルでは、ユーザー名に使用できるのは以下の文字種だけに限られている。

  • 英大文字/小文字 a-zA-Z
  • 数字 0-9
  • アンダースコア _

また文字数には 3~20 文字の制限がある。
以下に、現状でのユーザー名の例を挙げる。

有効

  • JohnSmith
  • john_smith
  • js2011

無効

  • 山田太郎
  • やまだたろう
  • ヤマダタロウ
  • J

拡張

ユーザー名に日本語も許容するように拡張する。
具体的には、現状の有効文字種に加えて、以下の文字種を追加する。

  • 漢字 一-龠
  • ひらがな ぁ-ん
  • カタカナ ァ-ヶ
  • 全角英数字 0-9a-zA-Z
  • 全角記号(ナカグロ・長音・イコール・アンダースコア・ハイフン)
    ・ー=_-
  • 半角記号(ハイフン) -

また、文字数は 1~20 文字の制限に(下限を)拡張する。
上限は、テーブルの列定義と関連しているので、触れない。

以下に、変更後 新たに有効になるユーザー名と、依然として無効のユーザー名の例を挙げる。

有効

  • 山田太郎
  • やまだたろう
  • ヤマダタロウ
  • J
  • YU-TANG
  • ジャン=リュック・ピカード
  • ジョーディ・ラ=フォージ

無効

  • 山田 太郎 (スペース文字は無効)
  • モーニング娘。(句点は無効)
  • 藤岡弘、(読点は無効)

実装方法

当初は日本語ロケール パック(言語ファイル)内で ValidateUsername() 関数をオーバーライドする予定だったが、実際に試すと ValidateUsername() 関数はどの言語定義ファイルよりも先に読み込まれてしまうらしく、オーバーライドできなかった。
そこで、conf/bootstrap.before.php 内でのオーバーライドに切り替える。

参考:

その他注意事項

エラーメッセージ

ユーザー名が無効時のエラーメッセージも併せて変更する必要がある。

$Definition['UsernameError'] = 'ユーザー名には 3~20 文字の英数字とアンダースコアのみ使用できます。';

$Definition['UsernameError'] = 'ユーザー名には 1~20 文字の英数字と日本語を使用できます。記号はナカグロ・長音・イコール(全角のみ)、アンダースコア・ハイフン(全半角)のみ使用できます。';

文字列長判定

Ver.2.0.17.9 時点の文字列長判定は、ASCII 以外の文字を正確に判定できない(日本語が 2~3 文字扱いになる)。
このバグは、コアの次リリースで修正される予定。

@リプライ(@mentions)

コメント中に @UserName と記述することによって、プロフィールへ自動リンクが張られる機能。
この機能は ASCII ユーザー名にしか対応していないため、ユーザー名の文字種を拡張した場合は、こちらも対応させる必要がある。
別件の課題 #5 として追加する。

@ghost ghost assigned yu-tang Apr 28, 2011
@yu-tang
Copy link
Owner Author

yu-tang commented Apr 30, 2011

正規表現のパターンについて、検討してみる。

オリジナルはこんな感じ。

'/^([\d\w_]{3,20})?$/si'

パターン修飾子がよく分からなかったので、確認。

PHP: 正規表現パターンに使用可能な修飾子 - Manual

i (PCRE_CASELESS)
この修飾子を設定すると、パターンの中の文字は 大文字にも小文字にもマッチします。

このパターンだと、要らないんじゃないかなぁ…。

s (PCRE_DOTALL)
この修飾子を設定すると、パターン中のドットメタ文字は 改行を含む全ての文字にマッチします。 これを設定しない場合は、改行にはマッチしません。 この修飾子は、Perl の /s 修飾子と同じです。 [^a] のような否定の文字クラスは、 この修飾子の設定によらず、常に改行文字にマッチします。

これも要らない気がする。パターンにドットメタ文字 無いし。

あとよく分からないのが、「(...)?」でサブパターン作って 0 または 1 回マッチの指定をしているように見える。
でも、サブパターン使ってないよね、別に?

以上を踏まえて、日本語対応のパターンの叩き台を作ってみる。

'/^[一-龠ぁ-んァ-ヶ・ー=\w\-0-9a-zA-Z_-]{1,20}$/u'

たしか「\w」で半角英数字とアンダースコアはカバーできるはず。

u (PCRE8)
この修正子は、Perl 非互換な PCRE の機能を有効にします。パターン 文字列は、UTF-8 エンコードされた文字列として処理されます。 この修正子は、UNIX では PHP 4.1.0 以降、Win32 では PHP 4.2.3 以降で 使用可能です。 また、PHP 4.3.5 以降では、パターンの UTF-8 としての妥当性も確認されます。

という感じで、どうでしょうか。

@yu-tang
Copy link
Owner Author

yu-tang commented Apr 30, 2011

テーブル定義を確認してみたら、ユーザー名の列 (gdn_user.Name) は varchar(50) になっていた。
ということは、その気になればユーザー名文字数の上限も拡張できるけれど。
20 文字を超える名前を付けたい人っているのかな。

@yama
Copy link
Collaborator

yama commented May 1, 2011

見てるだけですんません。ユーザー名に日本語使えるといいですねー

@yama yama closed this as completed May 1, 2011
@yama
Copy link
Collaborator

yama commented May 1, 2011

うわっ、閉じちゃった。すんません。 orz

@yama yama reopened this May 1, 2011
@yu-tang yu-tang closed this as completed in 246a273 May 1, 2011
@yu-tang
Copy link
Owner Author

yu-tang commented May 1, 2011

@yama 気にしない気にしない
関連コミット

@honda0510
Copy link
Collaborator

大変遅くなりましたが、ユーザー名に日本語が使えることを確認しました。
「月」が使えると自分という気がします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants