--- ox-ascii.el.org	2021-03-26 09:28:44.000000000 +0900
+++ ox-ascii.el	2021-05-02 09:02:41.168565362 +0900
@@ -697,7 +697,8 @@
 			      (plist-get info :ascii-underline))))))
 	 (and under-char
 	      (concat "\n"
-		      (make-string (/ (string-width first-part)
+		      (make-string (/ (+ (string-width first-part)
+                                         (1- (char-width under-char)))
 				      (char-width under-char))
 				   under-char))))))))
 
@@ -748,11 +749,13 @@
 contents according to the specified scope."
   (concat
    (unless scope
-     (let ((title (org-ascii--translate "Table of Contents" info)))
+     (let ((title (org-ascii--translate "Table of Contents" info))
+           (under-char (if (eq (plist-get info :ascii-charset) 'utf-8) ?─ ?_)))
        (concat title "\n"
 	       (make-string
-		(string-width title)
-		(if (eq (plist-get info :ascii-charset) 'utf-8) ?─ ?_))
+		(/ (+ (string-width title) (1- (char-width under-char)))
+                   (char-width under-char))
+		under-char)
 	       "\n\n")))
    (let ((text-width
 	  (if keyword (org-ascii--current-text-width keyword info)
@@ -776,11 +779,13 @@
 
 KEYWORD is the keyword that initiated the list of listings
 generation.  INFO is a plist used as a communication channel."
-  (let ((title (org-ascii--translate "List of Listings" info)))
+  (let ((title (org-ascii--translate "List of Listings" info))
+        (under-char (if (eq (plist-get info :ascii-charset) 'utf-8) ?─ ?_)))
     (concat
      title "\n"
-     (make-string (string-width title)
-		  (if (eq (plist-get info :ascii-charset) 'utf-8) ?─ ?_))
+     (make-string (/ (+ (string-width title) (1- (char-width under-char)))
+                     (char-width under-char))
+		  under-char)
      "\n\n"
      (let ((text-width
 	    (if keyword (org-ascii--current-text-width keyword info)
@@ -816,11 +821,13 @@
 
 KEYWORD is the keyword that initiated the list of tables
 generation.  INFO is a plist used as a communication channel."
-  (let ((title (org-ascii--translate "List of Tables" info)))
+  (let ((title (org-ascii--translate "List of Tables" info))
+        (under-char (if (eq (plist-get info :ascii-charset) 'utf-8) ?─ ?_)))
     (concat
      title "\n"
-     (make-string (string-width title)
-		  (if (eq (plist-get info :ascii-charset) 'utf-8) ?─ ?_))
+     (make-string (/ (+ (string-width title) (1- (char-width under-char)))
+                     (char-width under-char))
+		  under-char)
      "\n\n"
      (let ((text-width
 	    (if keyword (org-ascii--current-text-width keyword info)
@@ -1030,6 +1037,7 @@
       ;; AUTHOR and its EMAIL are both overlined and an underlined,
       ;; centered.  Date is just below, also centered.
       (let* ((utf8p (eq (plist-get info :ascii-charset) 'utf-8))
+             (line-char (if utf8p ?━ ?_))
 	     ;; Format TITLE.  It may be filled if it is too wide,
 	     ;; that is wider than the two thirds of the total width.
 	     (title-len (min (apply #'max
@@ -1042,11 +1050,14 @@
 				   (org-ascii--fill-string subtitle title-len info)))
 	     (line
 	      (make-string
-	       (min (+ (max title-len
-			    (string-width (or author ""))
-			    (string-width (or email "")))
-		       2)
-		    text-width) (if utf8p ?━ ?_))))
+	       (/ (+ (min (+ (max title-len
+			       (string-width (or author ""))
+			       (string-width (or email "")))
+		          2)
+		          text-width)
+                     (1- (char-width line-char)))
+                  (char-width line-char))
+               line-char)))
 	(org-ascii--justify-lines
 	 (concat line "\n"
 		 (unless utf8p "\n")
@@ -1079,12 +1090,15 @@
 	 (when definitions
 	   (concat
 	    "\n\n\n"
-	    (let ((title (org-ascii--translate "Footnotes" info)))
+	    (let ((title (org-ascii--translate "Footnotes" info))
+                  (under-char (if (eq (plist-get info :ascii-charset) 'utf-8)
+                                  ?─ ?_)))
 	      (concat
 	       title "\n"
 	       (make-string
-		(string-width title)
-		(if (eq (plist-get info :ascii-charset) 'utf-8) ?─ ?_))))
+		(/ (+ (string-width title) (1- (char-width under-char)))
+                   (char-width under-char))
+		under-char)))
 	    "\n\n"
 	    (let ((text-width (- (plist-get info :ascii-text-width)
 				 global-margin)))
@@ -1381,11 +1395,14 @@
 See `org-ascii-format-inlinetask-function' for a description
 of the parameters."
   (let* ((utf8p (eq (plist-get info :ascii-charset) 'utf-8))
-	 (width (or width (plist-get info :ascii-inlinetask-width))))
+	 (width (or width (plist-get info :ascii-inlinetask-width)))
+         (under-char (if utf8p ?━ ?_)))
     (org-ascii--indent-string
      (concat
       ;; Top line, with an additional blank line if not in UTF-8.
-      (make-string width (if utf8p ?━ ?_)) "\n"
+      (make-string (/ (+ width (1- (char-width under-char)))
+                      (char-width under-char))
+                   under-char) "\n"
       (unless utf8p (concat (make-string width ? ) "\n"))
       ;; Add title.  Fill it if wider than inlinetask.
       (let ((title (org-ascii--build-title inlinetask info width)))
@@ -1395,9 +1412,14 @@
       ;; If CONTENTS is not empty, insert it along with
       ;; a separator.
       (when (org-string-nw-p contents)
-        (concat (make-string width (if utf8p ?─ ?-)) "\n" contents))
+        (concat (make-string (/ (+ width (1- (char-width under-char)))
+                                (char-width under-char))
+                             under-char)
+                "\n" contents))
       ;; Bottom line.
-      (make-string width (if utf8p ?━ ?_)))
+      (make-string (/ (+ width (1- (char-width under-char)))
+                      (char-width under-char))
+                   under-char))
      ;; Flush the inlinetask to the right.
      (- (plist-get info :ascii-text-width) (plist-get info :ascii-global-margin)
 	(if (not (org-export-get-parent-headline inlinetask)) 0
@@ -1948,7 +1970,8 @@
 		(org-element-map table-row 'table-cell
 		  (lambda (cell)
 		    (let ((width (org-ascii--table-cell-width cell info))
-			  (borders (org-export-table-cell-borders cell info)))
+			  (borders (org-export-table-cell-borders cell info))
+                          (horiz-char (string-to-char horiz)))
 		      (concat
 		       ;; In order to know if CELL starts the row, do
 		       ;; not compare it with the first cell in the
@@ -1960,7 +1983,9 @@
 					'identity info t)
 				      cell))
 			 lcorner)
-		       (make-string (+ 2 width) (string-to-char horiz))
+		       (make-string (/ (+ 2 width (1- (char-width horiz-char)))
+                                       (char-width horiz-char))
+                                    horiz-char)
 		       (cond
 			((not (memq 'right borders)) nil)
 			((eq (car (last (org-element-contents table-row))) cell)
