95683


`json.loads(text)`
メソッドを利用して、文字列をjsonオブジェクト(dict型)に変換したいのですが、全角スペースが'\u3000'と変換されてしまいます。  
全角スペースのまま変換することは可能でしょうか？

◇試したコード

[code]

    import json
    from typing import Dict
    
    text: str = '{"code":"123", "message":"テスト　メッセージ"}'
    print(type(text), text)
    
    json_map: Dict[str, str] = json.loads(text)
    print(type(json_map), json_map)
    
[/code]

◇実行結果

[code]

    <class 'str'> {"code":"123", "message":"テスト　メッセージ"}
    <class 'dict'> {'code': '123', 'message': 'テスト\u3000メッセージ'}
    
[/code]

dict型に変換後も、  
`{'code': '123', 'message': 'テスト メッセージ'}`  
と全角スペースのままにできないでしょうか。


CC BY-SA 4.0
2023-07-19T01:55:31.187
95682
2023-07-19T05:24:17.540
2023-07-19T05:24:17.540
3060
53109
question
python python3 json unicode
unicodeエスケープすることなく、文字列をjsonオブジェクトに変換したい


それは全角スペースのままか'\u3000'とエスケープ表記されるかといったprintで表示している見た目上だけの違いです。  
たとえばタブ文字がインデントして表示されるかエスケープ表記されるかといった違いと同じです。  
文字自体はどちらも同じ全角スペースです。

[code]

    s = 'テスト　メッセージ\tです'
    print(s) # テスト　メッセージ      です
    
    l = [s]
    print(l) # ['テスト\u3000メッセージ\tです']
    print(l[0]) # テスト　メッセージ      です
    
    print(s == l[0]) # True
    
[/code]


CC BY-SA 4.0
2023-07-19T02:17:59.360
95683
2023-07-19T02:17:59.360
25830
95682
answer


すでに解決済みのようで余計なレスかもしれませんが・・・

> 全角スペースが'\u3000'と変換されてしまいます。

それは Unicode Escape Sequence (以下 UES と書きます) という形にエスケープされた結果です。

UES というのは \uxxxx という形で表される Unicode 文字で、xxxx はその文字の Unicode コードになります。

ちなみに、ASP.NET Core MVC では非 ASCII 文字は全てデフォルトで UES になります。ASCII 文字でも HTML-
sensitive characters はエスケープされます。例えば、< とか > はそれぞれ \u003C および \u003E になります。

Python でどこまでエスケープされるのかは分かりませんが、U+3000 については Space_Separator [Zs] category
に属するということなのでエスケープされたのだと思います。

詳しくは以下の記事や、

ASP.NET Core MVC の Unicode Escape Sequence (UES)  
<http://surferonwww.info/BlogEngine/post/2020/03/11/aspnet-core-mvc-
controller-json-method-replaces-non-ascii-characters-with-5cuxxxx.aspx>

それからリンクが張ってある以下の記事の回答を見てください。

Can't serializ the '\u3000' when using with UnicodeRanges.All  
<https://github.com/dotnet/docs/issues/22147>


CC BY-SA 4.0
2023-07-19T04:36:16.377
95686
2023-07-19T04:36:16.377
51338
95682
answer