web-dev-qa-db-ja.com

JSON文字エンコード

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であり、各応答にデフォルトの文字セットを設定する方法があるはずだと思いますか?

55
Dónal

症状は、もともと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として表示されます。

54
BalusC

これがもう関係があるかどうかはわかりませんが、@ RequestMappingアノテーションで修正しました。

@RequestMapping(method=RequestMethod.GET, produces={"application/json; charset=UTF-8"})
31

まず、投稿されたデータは有効な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ページにデータを挿入する方法は?

15
Thanatos

最終的に私は解決策を得た:

この行だけを置く

@RequestMapping(value = "/YOUR_URL_Name",method = RequestMethod.POST,produces = "application/json; charset=utf-8")

これは間違いなく役立ちます。

8
AbdulHayee

これはまったく同じことでした。

<%@ 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に。

5
Jorge Carretero
response.setContentType("application/json;charset=utf-8");
3
ton

ここでの答えは私の問題を解決するのに役立ちましたが、完全に関連しているわけではありません。 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依存関係を追加する必要があるかもしれません。

1

StringEntityを使用している場合は、選択した文字エンコードを使用して this を試してください。外国語の文字も処理します。

0
craned

上記の提案された解決策で問題を解決できなかった場合(私の場合)、これも役立ちます:

私の問題は、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

0
Erando

また、スプリングアノテーションRequestMappingを使用して、すべての応答でapplication/json; utf-8を取得することができます。

@Controller
@RequestMapping(produces = {"application/json; charset=UTF-8","*/*;charset=UTF-8"})
public class MyController{
 ...
}
0
Yuri Gavrysh