2016-04-27 8 views
-1

私の人生にとっては、これがなぜ機能しないのか理解できません。Javascript:str.indexOfは£記号で動作しません

ユーザーは、私がペニーに変換している文字列を入力します(1ポンド= 100ペニー)。文字列に最初の文字として£記号が含まれている場合は、変換に100を掛けることがわかります。

私の問題は、最初の文字が£かどうかを調べるためにif文を使用していることです。私はindexOf()を使用していますが、文字£を捕まえません。私はconsole.log(userInput.indexOf("£"));を使用して返されるものを確認し、0を記録します。私が知る限り、これはif文では機能しません。

ここに私のコードです:

HTML

<html ng-app="main"> 
<head> 
    <meta charset="ISO-8859-1"> 
    <title></title> 
    <script src ="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.5/angular.min.js" type="text/javascript"></script> 

    <link rel="stylesheet" type="text/css" href="main.css"> 
</head> 
<body ng-controller="mainController"> 
     <input type="submit" ng-click="trim()"> 
    <script type="text/javascript" src="main.js"></script> 
</body> 
</html> 

角度

$scope.trim = function(){ 
    var userInput = "£1234"; 

    if(userInput.indexOf("£") == 0){ 
     userInput = userInput.substr(1); 
     userInput *= 100; 

    } 

} 

私は01のため£123を使用していますと入力し、入力するとyou have entered an invalid characterと表示されます。すべての助けに感謝します。

+0

'はconsole.log(userInput.indexOf( "£"))' 'あなたは£は' *最初の*文字であるかどうかを確認するためにチェックしている –

+1

のに役立ちます。その前に空白があるとどうなりますか? –

+2

上記のコードブロックを[mcve]にする必要があります(これは簡単に '<>'ツールバーボタンを使用し、必要なライブラリを追加するなど)。結論:文字列に£がある場合、 'indexOf' **はそれを見つけます**。 –

答えて

1

あなたのuserInput.indexOf("£") == 0は機能しませんでした。それはあなたのライン

userInput = userInput.substr(1); 

それはあなたのエディタがUTF-8としてファイルを保存していることであるべきによるものであり、HTMLページの文字エンコーディングは、ISO-8859-1であると言います。今すぐ"£".length2であり、userInput.substr(1)は機能しません。この場合はuserInput.substr(2)にする必要がありますが、ファイルエンコーディングと<meta charset="...">を一致させる方が良いと思います。

ファイルのエンコーディングをISO-8859-1に変更すると、正常に動作します。 (Emacsでは、C-x Return fを使用し、iso-8859-1を選択してファイルを再度保存してください)。

または単に<meta charset="utf-8">とファイルのエンコードに一致するとし、userInput.substr(1)は期待どおりに機能します。

サンプル:https://jsfiddle.net/g91wvsp6/1/

このサンプル・ページが<meta charset="utf-8">を使用していると予想される結果と協力しています。

+0

それは文字セットの問題かもしれませんが、盲目的に ''を追加するのは解決策ではありません。文字セット(スクリプトとHTMLの両方、使用されているバックエンドなど)を正しく処理することは、解決策になります。 –

+0

@ T.J.Crowderそれは "盲目的に' '" –

+0

はい、**今**答えは実際にもっと何かを言っています。それは私が上記のコメントを投稿したときにしなかった。 –

0

太極者無極而生's answerに触発され、このコミュニティのwikiの答えが、その答えを作るために、大きな編集することのように思えた。)

これは、エンコーディングの不一致の問題のように聞こえます。 JavaScriptファイルが1つの文字セット(たとえば、いくつかのWindowsツールで「ANSI」と呼ばれるISO-8859-1)でエンコードされていて、別の文字セット(UTF-8など)でサーバーが処理している場合、ファイルの£正しく認識されません。ファイルがISO-8859-1でUTF-8として使用されている場合、£は無効な文字になります。ファイルがISO-8859-1として提供されるUTF-8の場合、と2つの文字になります。いずれの場合も、ユーザーの入力した£と一致しません。

  1. をあなたのJavaScript(およびなどのHTML、CSSを、)をコードするファイルが実際に保存されているものを知っていることを確認あなたのテキストエディタがそれをやって周りの機能を持っている必要があります。それを修正するには

    。あなたのページが主に西洋のテキスト(英語など)の場合は、UTF-8を強くお勧めします。

  2. HTMLとJavaScriptファイルに同じエンコードを使用してください。私はそれらのために異なるエンコーディングを使用することが可能だと確信していますが、それは痛みになるでしょう。人生をシンプルに保ち、全体を通して同じエンコーディングを使用してください。

  3. それらのリソースを提供する際に、サーバーが正しくContent-Typeレスポンスヘッダを送信するとき、それはUTF-8のJavaScriptファイル(だけでなく、Content-Type: application/javascript)についてContent-Type: application/javascript; charset=UTF-8する必要があります例えば、文字セットを識別していることを確認してください。

関連する問題