まず:https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
あなたはAccept-Language
ヘッダフィールドの定義を見ることができますが、次のとおりです。
Accept-Language = "Accept-Language" ":"
1#(language-range [ ";" "q" "=" qvalue ])
language-range = ((1*8ALPHA *("-" 1*8ALPHA)) | "*")
適切にフォーマットされたヘッダの例です。 :Accept-Language: da, en-gb;q=0.8, en;q=0.7
。各コンマ,
は言語タプルを区切ります。各言語タプルはlanguage-range
とquality weight
です(オプション)。
Accept-Language
ヘッダーがどのように定義されているか分かったので、唯一の問題はそれを解析する方法です。
あなたは言語に応じてさまざまな方法でこれを実装することができますが、私は擬似コードを書きます:エラーに対処する言語に応じて異なる
function parseAcceptLanguageHeader(headerValue):
parsedLanguages = []
languageStrings = headerValue.split(",")
foreach languageStrings as S do
parsedLanguages.add(parse(S))
return parsedLanguages
// Here we define parse(S)
function parse(S): // expecting format of S to be like: 'language-range [";q=<number>"]'
vals = S.trim().split(";") // remove leading and trailing spaces and split by ;
if vals.length == 1: // means 'q=qvalue' part is missing
return vals[0].trim(), 1.0 // default q is 1.0; you can additionally verify that vals[0] is one of the languages that you support
else if vals.length == 2:
return vals[0].trim(), parseQuality(vals[1])
else raise an error ("Expected two tokens but, got: " + S)
// Implement parse quality
function parseQuality(S):
// We expect to see 'q=<number>'
vals = q.split("=")
if (vals.length != 2):
raise an error ("Expected exactly two tokens for quality, but got: " + S)
else if (vals[0] != 'q'):
raise an error ("Expected quality (q) but got: " + S)
else
return parseInt(vals[1].trim()) // This can also throw an error, but I am not going to write implementation for that function
注意を。
これは確かにどの言語を使用しているのか、また「解析する」言語の意味はどうかによって異なります。 'en'や' es'のようなトークンを取得したいだけですか? 'q = 0.5'で何をしたいですか?あなたはそれを無視するか、エラーを投げたいですか? –
ひどくフォーマットされたヘッダーの場合、私はユーザーに認識させたいが、ひどくフォーマットされたヘッダーを検出するには、自分自身でハードコーディングしないことを好む。 – LetsPlayYahtzee
"良い"ヘッダーはどのように見えるのだろうか? 誰かが適切にフォーマットされたヘッダーのルールを定義する必要があります。そのルールを使用してヘッダーを解析することができます。ある時点でヘッダーがルールに対応していない場合は、フォーマットが正しくありません。 'q = 0.5'は重みを表し、言語ニーモニックの後に常に現れるはずです。 –