Java Webアプリケーションは、次のようなJSONを返すAJAXリクエストを送信します。
{'value': 'aériennes'}
「aériennes」がWebページに表示されると、「a�riennes」と表示されるため、何らかの文字エンコードの問題があると思います。 AJAX応答ヘッダーには、
Content-Type application/json
文字セット情報が含まれていないようです。これを次のように変更する必要があると思います
Content-Type text/html; charset=iso-8859-1 (or charset=utf8)
アプリのサーバー側はSpring MVCであり、各応答にデフォルトの文字セットを設定する方法があるはずだと思いますか?
症状は、もともとUTF-8エンコードであったJSON文字列がISO-8859-1エンコードを使用してHTTP応答に書き込まれ、webbrowserがUTF-8として表示するように指示されたことを示しています。 UTF-8を使用して記述され、ISO-8859-1として表示されている場合、aériennes
が表示されているはずです。 ISO-8859-1を使用してandと表示されている場合、a�riennes
が表示されています。
JSON文字列がISO-8859-1として誤って記述されているという問題を修正するには、HTTP応答エンコーディングとしてUTF-8を使用するようにwebapp/Springを構成する必要があります。 基本的に、カバーの下で以下を実行する必要があります。
response.setCharacterEncoding("UTF-8");
コンテンツタイプヘッダーを変更しないでください。 JSONにはまったく問題なく、UTF-8として表示されます。
これがもう関係があるかどうかはわかりませんが、@ RequestMappingアノテーションで修正しました。
@RequestMapping(method=RequestMethod.GET, produces={"application/json; charset=UTF-8"})
まず、投稿されたデータは有効なJSONではありません。これは:
{"value": "aériennes"}
二重引用符に注意してください。これらは必須です。
JSONデータのContent-Type あるべきapplication/json
。実際のJSONデータ(上記のもの)は、UTF-8、UTF-16、またはUTF-32を使用してエンコードする必要があります。UTF-8を使用することをお勧めします。
Wiresharkなどのツールを使用して、ネットワークトラフィックを監視し、データがどのように見えるかを確認できます。éのバイトc3 89
が表示されます。 Springを使用したことはありませんが、JSONエンコーディングを実行している場合は、おそらく適切に処理されます。
JSONがブラウザーに到達すると、有効であれば、それは良好なはずです。ただし、JSON応答からWebページにデータを挿入する方法は?
最終的に私は解決策を得た:
この行だけを置く
@RequestMapping(value = "/YOUR_URL_Name",method = RequestMethod.POST,produces = "application/json; charset=utf-8")
これは間違いなく役立ちます。
これはまったく同じことでした。
<%@ page language="Java" contentType="application/json" pageEncoding="UTF-8"%>
しかし、これは私にとってはうまくいきます:
<%@ page language="Java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%>
追加してみてください
;charset=UTF-8
contentTypeに。
response.setContentType("application/json;charset=utf-8");
ここでの答えは私の問題を解決するのに役立ちましたが、完全に関連しているわけではありません。 javax.ws.rs APIと@Producesおよび@Consumesアノテーションを使用しますが、これと同じ問題がありました。Webサービスで返されたJSONはUTF-8ではありませんでした。コントローラー関数の上に次の注釈を付けて解決しました:
@Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8")
そして
@Consumes(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8")
すべてのエンドポイントの取得および投稿機能。文字セットを設定しておらず、これで解決しました。これはジャージの一部なので、Maven依存関係を追加する必要があるかもしれません。
StringEntity
を使用している場合は、選択した文字エンコードを使用して this を試してください。外国語の文字も処理します。
上記の提案された解決策で問題を解決できなかった場合(私の場合)、これも役立ちます:
私の問題は、Springs @ResponseBody
を使用して、応答でJSON文字列を返していたことです。あなたもこれをやっている場合、これは役立つかもしれません。
次のBeanをディスパッチャサーブレットに追加します。
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean
class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
(ここにあります: http://forum.spring.io/forum/spring-projects/web/74209-responsebody-and-utf-8 )
また、スプリングアノテーションRequestMappingを使用して、すべての応答でapplication/json; utf-8を取得することができます。
@Controller
@RequestMapping(produces = {"application/json; charset=UTF-8","*/*;charset=UTF-8"})
public class MyController{
...
}