【问题标题】:Java - removing \u0000 from an StringJava - 从字符串中删除 \u0000
【发布时间】:2015-05-13 10:34:15
【问题描述】:

我正在使用 Twitter API,并且我有以下字符串困扰着我 Proyecto de ingeniera comercial, actual Profesora de matemáticas \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Enseña Chile
我想将它存储在 PostgreSql 中,但 \u0000 不被接受,所以我想替换它。
我尝试使用string= string.replaceAll("\\u0000", "");,但它不起作用。我只是得到以下内容

String json = TwitterObjectFactory.getRawJSON(user);
System.out.println(json);
json = json.replaceAll("\\u0000", "");
System.out.println(json);

输出(仅重要的部分)

Proyecto de ingeniera comercial, actual Profesora de matemáticas \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Enseña Chile
Proyecto de ingeniera comercial, actual Profesora de matemáticas \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Enseña Chile

如果我将该部分放在 java 中的 String 中,则替换有效,但如果我将其放在文本文件中,或者我直接为 Twitter 阅读它,它不起作用
所以我的问题是,如何替换 \u0000从一个字符串?
顺便说一句,完整的字符串是这样的

{"utc_offset":null,"friends_count":83,"profile_image_url_https":"https://pbs.twimg.com/profile_images/2636139584/3a8455cd94045fa6980402add14796a9_normal.jpeg","listed_count":1,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","default_profile_image":false,"favourites_count":0,"description":"Proyecto de ingeniera comercial, actual Profesora de matemáticas \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Enseña Chile","created_at":"Sat May 28 14:24:06 +0000 2011","is_translator":false,"profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","protected":false,"screen_name":"Fsquadritto","id_str":"306825274","profile_link_color":"0084B4","is_translation_enabled":false,"id":306825274,"geo_enabled":false,"profile_background_color":"C0DEED","lang":"es","profile_sidebar_border_color":"C0DEED","profile_location":null,"profile_text_color":"333333","verified":false,"profile_image_url":"http://pbs.twimg.com/profile_images/2636139584/3a8455cd94045fa6980402add14796a9_normal.jpeg","time_zone":null,"url":null,"contributors_enabled":false,"profile_background_tile":false,"entities":{"description":{"urls":[]}},"statuses_count":2,"follow_request_sent":false,"followers_count":36,"profile_use_background_image":true,"default_profile":true,"following":false,"name":"Fiorella Squadritto","location":"","profile_sidebar_fill_color":"DDEEF6","notifications":false,"status":{"in_reply_to_status_id_str":null,"in_reply_to_status_id":null,"possibly_sensitive":false,"coordinates":null,"created_at":"Fri Oct 12 17:40:35 +0000 2012","truncated":false,"in_reply_to_user_id_str":null,"source":"<a href=\"http://instagram.com\" rel=\"nofollow\">Instagram<\/a>","retweet_count":1,"retweeted":false,"geo":null,"in_reply_to_screen_name":null,"entities":{"urls":[{"display_url":"instagr.am/p/QsOQxTNfvQ/","indices":[49,69],"expanded_url":"http://instagr.am/p/QsOQxTNfvQ/","url":"http://t.co/GKziME7N"}],"hashtags":[{"indices":[24,34],"text":"eduinnova"}],"user_mentions":[{"indices":[35,47],"screen_name":"ensenachile","id_str":"57099132","name":"Enseña Chile","id":57099132}],"symbols":[]},"id_str":"256811615171792896","in_reply_to_user_id":null,"favorite_count":1,"id":256811615171792896,"text":"Amando las matemáticas! #eduinnova @ensenachile  http://t.co/GKziME7N","place":null,"contributors":null,"lang":"es","favorited":false}}

【问题讨论】:

  • 试试json = json.replace("\u0000", "");
  • 奇怪...我只是通过使用您提供的值初始化字符串并替换工作正常来尝试相同。您是否尝试过同样的方法,使用预定义的字符串而不是 API 响应?
  • 我用预定义的字符串尝试了同样的方法,它可以工作,但是使用 api 响应(或从文件中读取)它不起作用......但是 Siome Riboldi 的评论用双反斜杠工作正常: D...我尝试了很多东西,但不是单独替换

标签: java string character-encoding


【解决方案1】:
string = string.replace("\u0000", ""); // removes NUL chars
string = string.replace("\\u0000", ""); // removes backslash+u0000

带有 u-escaping 的字符是在 java 源代码级别上完成的。例如“类”是:

public \u0063lass C {

你也不需要正则表达式。

【讨论】:

  • 谢谢,string.replace("\\u0000", "");(带有双反斜杠)有效(:
  • 带单不?所以真的写了反斜杠+u+0000。
  • 看来最初的问题是关于在编码空字节的原始 JSON 字符串中替换空字节。我猜想处理这个问题的正确方法是在将 JSON 字符串作为输入提供给 PostgreSQL 之前正确编码它。以下在 PostgreSQL 中使用 json 字段类型可以正常工作:insert into test values (1, '{ "string_with_null": "a\u0000b" }');
【解决方案2】:

replaceAll 的第一个参数是正则表达式,Java 正则表达式引擎理解 \uNNNN 转义所以

json.replaceAll("\\u0000", "")

将搜索 正则表达式 \u0000,它匹配 Unicode NUL 字符 (U+0000) 的实例, 实际字符串 \u0000 的实例.如果要匹配字符串\u0000,则需要使用正则表达式\\u0000,这又意味着Java字符串文字"\\\\u0000"

json.replaceAll("\\\\u0000", "")

或者更简单地说,使用replace(其第一个参数是文字字符串而不是正则表达式)而不是replaceAll

json.replace("\\u0000", "")

【讨论】:

    【解决方案3】:

    在某些情况下,输入文本包含多个反斜杠,后跟 \u0000。处理所有案件

      String test = "ABC\\u0000DEF\\\\u0000123";
      System.out.println(test.replaceAll("[\\\\]+u0000","")); 
    

    【讨论】:

      猜你喜欢
      • 2010-09-24
      • 2017-05-21
      • 2011-08-07
      • 2010-10-10
      • 1970-01-01
      • 2013-08-20
      • 2013-07-05
      • 2012-01-27
      • 2015-09-14
      相关资源
      最近更新 更多