[PATCH 1/2] Show 4 byte UTF-8 as \Uxxxxxxxx Simplify this by using a single uint32 rather than four bytes.

Andrew C Aitchison werdna@aitchison.me.uk
Tue Sep 9 11:04:35 GMT 2025


---
 binutils/doc/binutils.texi | 32 +++++++++++++++++---------------
 binutils/nm.c              |  9 +++++----
 binutils/objdump.c         |  9 +++++----
 binutils/readelf.c         | 10 +++++-----
 binutils/strings.c         |  2 +-
 5 files changed, 33 insertions(+), 29 deletions(-)

diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi
index 89425b8a15b..60a448a36d0 100644
--- a/binutils/doc/binutils.texi
+++ b/binutils/doc/binutils.texi
@@ -1213,10 +1213,11 @@ in the current locale, which may or may not support them.  The options
 hex byte sequences enclosed by either angle brackets or curly braces.
 
 The @option{--unicode=escape} option displays them as escape sequences
-(@var{\uxxxx}) and the @option{--unicode=highlight} option displays
-them as escape sequences highlighted in red (if supported by the
-output device).  The colouring is intended to draw attention to the
-presence of unicode sequences where they might not be expected.
+(@var{\uxxxx} and @var{\Uxxxxxxxx}) and the @option{--unicode=highlight}
+option displays them as escape sequences highlighted in red (if
+supported by the output device).  The colouring is intended to draw
+attention to the presence of unicode sequences where they might not be
+expected.
 
 @item -W
 @itemx --no-weak
@@ -3079,10 +3080,11 @@ in the current locale, which may or may not support them.  The options
 hex byte sequences enclosed by either angle brackets or curly braces.
 
 The @option{--unicode=escape} option displays them as escape sequences
-(@var{\uxxxx}) and the @option{--unicode=highlight} option displays
-them as escape sequences highlighted in red (if supported by the
-output device).  The colouring is intended to draw attention to the
-presence of unicode sequences where they might not be expected.
+(@var{\uxxxx} and @var{\Uxxxxxxxx}) and the @option{--unicode=highlight}
+option displays them as escape sequences highlighted in red (if
+supported by the output device).  The colouring is intended to draw
+attention to the presence of unicode sequences where they might not be
+expected.
 
 @item -V
 @itemx --version
@@ -3492,11 +3494,11 @@ The @option{--unicode=locale} option displays them in the current
 locale, which may or may not support UTF-8 encoding.  The
 @option{--unicode=hex} option displays them as hex byte sequences
 enclosed between @var{<>} characters.  The @option{--unicode=escape}
-option displays them as escape sequences (@var{\uxxxx}) and the
-@option{--unicode=highlight} option displays them as escape sequences
-highlighted in red (if supported by the output device).  The colouring
-is intended to draw attention to the presence of unicode sequences
-where they might not be expected.
+option displays them as escape sequences (@var{\uxxxx} and
+@var{\Uxxxxxxxx}) and the @option{--unicode=highlight} option displays
+them as escape sequences highlighted in red (if supported by the output
+device).  The colouring is intended to draw attention to the presence of
+unicode sequences where they might not be expected.
 
 @item -T @var{bfdname}
 @itemx --target=@var{bfdname}
@@ -5231,8 +5233,8 @@ they are displayed as a sequence of hex bytes, encloses in curly
 parethesis characters.
 
 Using the @option{--unicode=escape} option will display the characters
-as as unicode escape sequences (@var{\uxxxx}).  Using the
-@option{--unicode=hex} will display the characters as hex byte
+as as unicode escape sequences (@var{\uxxxx} and @var{\Uxxxxxxxx}).
+Using the @option{--unicode=hex} will display the characters as hex byte
 sequences enclosed between angle brackets.
 
 Using the @option{--unicode=highlight} will display the characters as 
diff --git a/binutils/nm.c b/binutils/nm.c
index 6aa5143d6f2..831f348127b 100644
--- a/binutils/nm.c
+++ b/binutils/nm.c
@@ -564,10 +564,11 @@ display_utf8 (const unsigned char * in, char * out, unsigned int * consumed)
 	  break;
 
 	case 4:
-	  out += sprintf (out, "\\u%02x%02x%02x",
-		  ((in[0] & 0x07) << 2) | ((in[1] & 0x30) >> 4),
-		  ((in[1] & 0x0f) << 4) | ((in[2] & 0x3c) >> 2),
-		  ((in[2] & 0x03) << 6) | ((in[3] & 0x3f)));
+	  out += sprintf (out, "\\U%08x",
+		  ((in[0] & 0x07) << 18) |
+		  ((in[1] & 0x3f) << 12) |
+		  ((in[2] & 0x3f) << 6) |
+		  ((in[3] & 0x3f)) );
 	  break;
 	default:
 	  /* URG.  */
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 34199e30ab8..7fc7b6fb86d 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -658,10 +658,11 @@ display_utf8 (const unsigned char * in, char * out, unsigned int * consumed)
 	  break;
 
 	case 4:
-	  out += sprintf (out, "\\u%02x%02x%02x",
-		  ((in[0] & 0x07) << 2) | ((in[1] & 0x30) >> 4),
-		  ((in[1] & 0x0f) << 4) | ((in[2] & 0x3c) >> 2),
-		  ((in[2] & 0x03) << 6) | ((in[3] & 0x3f)));
+	  out += sprintf (out, "\\U%08x",
+		  ((out[0] & 0x07) << 18) |
+		  ((out[1] & 0x3f) << 12) |
+		  ((out[2] & 0x3f) << 6) |
+		  ((out[3] & 0x3f)) );
 	  break;
 	default:
 	  /* URG.  */
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 8162cbb7003..2ed40f073fb 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -847,11 +847,11 @@ print_symbol_name (signed int width, const char * symbol)
 		case 4:
 		  if (width_remaining < 8)
 		    break;
-		  printf ("\\u%02x%02x%02x",
-			  ((bytes[0] & 0x07) << 2) | ((bytes[1] & 0x30) >> 4),
-			  ((bytes[1] & 0x0f) << 4) | ((bytes[2] & 0x3c) >> 2),
-			  ((bytes[2] & 0x03) << 6) | (bytes[3] & 0x3f));
-
+		  printf ("\\U%08x",
+			  ((bytes[0] & 0x07) << 18) |
+			  ((bytes[1] & 0x3f) << 12) |
+			  ((bytes[2] & 0x3f) << 6) |
+			  ((bytes[3] & 0x3f)) );
 		  break;
 		default:
 		  /* URG.  */
diff --git a/binutils/strings.c b/binutils/strings.c
index 8132b2ec1ae..4bf8b19d6e0 100644
--- a/binutils/strings.c
+++ b/binutils/strings.c
@@ -757,7 +757,7 @@ display_utf8_char (const unsigned char * buffer)
 	  break;
 
 	case 4:
-	  printf ("\\u%06x",
+	  printf ("\\U%08x",
 		  ((buffer[0] & 0x07) << 18) |
 		  ((buffer[1] & 0x3f) << 12) |
 		  ((buffer[2] & 0x3f) << 6) |
-- 
2.48.1



More information about the Binutils mailing list