使用しているプログラミング言語は Python ですか? Python であれば,urllib.parse.quote
関数が使えます.
from urllib.parse import quote
id = quote('ABCD#002')
print(id) #=> ABCD%23002
なぜ URL encode が必要かと言うと,#
という文字が URL の中で特別な意味を持つからです.たとえば https://www.example.com/foo#bar
という URL なら,「https://www.example.com/foo
というページの #bar
という場所」を表します.#bar
はアンカーと呼ばれます.
質問にある URL https://ABCD#002:abcd1abcd@ログインurl
なら,「https://ABCD
というページの #002:abcd1abcd@ログインurl
という場所」です.ただし,https://ABCD
は自動的に https://ABCD/
と解釈され(正規化),また ABCD
というドメインは abcd
と変換される(case insensitivity)ので,https://abcd/#002:abcd1abcd@ログインurl
になってしまうわけです.#002:abcd1abcd@ログインurl
はアンカーです.
これは本来期待する動作ではありませんね.#
はアンカーを示す記号ではなく,ユーザ ID の一部として認識してほしいのです.そういう場合には,#
を URL encode することで「#
はアンカーを示す記号ではなく #
という文字そのもの」ということをブラウザ等に教える必要があります.ではどうやって「#
という文字そのもの」を表すかというと,#
を %23
に変換してあげます.パーセントエンコードという別名の由来ですね.23
は #
の ASCII コードです.
幸いにして,ほとんどのプログラミング言語では URL encode のための関数が用意してあります.Python なら,冒頭に揚げた urllib.parse.quote
です.(URL encode の関数はいくつかバリエーションがあるので注意は必要です.)サンプルコードとしては,
from urllib.parse import quote
id = 'ABCD#002'
pw = 'abcd1abcd'
# ケース 1
url = 'https://' + quote(id) + ':' + quote(pw) + '@ログインurl'
# ケース 2
url = 'https://' + quote(id + ':' + pw, ':') + '@ログインurl'
ケース 1 とケース 2 はどちらでも動作します.詳しくは各自で調べてみてください.