如何在r中正确连接bidi字符串?

时间:2016-11-11 03:44:29

标签: r shiny string-concatenation bidi urdu

我想将标记添加到从右到左书写的(乌尔都语)文本中。我试图使用gsub用于此目的,但到目前为止我尝试的所有内容都没有产生所需的输出

text <- "یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے"
pattern <- "کیا جا"
replaceWith <- paste0("<somemark>", pattern, "</somemark>")
gsub(pattern, replaceWith, text)

gsub返回以下内容

یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark> رہا ہے

期望的输出。

enter image description here

如何实现所需的输出?

注意:我甚至无法在帖子中正确排版所需的输出,我不得不依赖图像。

更新:虽然下面的mysub函数正确连接字符串(在控制台中),但我仍然面临闪亮应用中文本顺序错误的问题。

mysub <- function(text, pattern){
beforePattern <- substr(text, 1, regexpr(pattern, text)[1]-1)
afterPattern <- substr(text, regexpr(pattern,text)[1] + nchar(pattern), nchar(text))
result <- paste(afterPattern, replaceWith, beforePattern)
result
}

2 个答案:

答案 0 :(得分:3)

;Definition of insert: inserts a number into an already sorted list based on ;the cmp parameter ;cmp: < or >, L1: a list, n: the number to be inserted (define (insert cmp L1 n) (cond ((null? n) (list L1)) ((null? L1) (cons n L1)) ((cmp n (car L1)) (cons n L1)) (else (cons (car L1) (insert cmp (cdr L1) n))) ) ) ;Definition of insertionSort: sorts a list based on a recursive insertion sort ;L1: a list, cmp: < or > (define (insertionSort L1 cmp) (cond ((null? L1) L1) (else (insert cmp (car L1) (insertionSort(cdr L1) cmp))) ) ) 实际上没有问题:

gsub

结果的渲染(包含从右到左和从左到右的字符的字符串)对我来说也是合乎逻辑的:

  1. 字符串的开头包含从右到左的字符,因此从右到左呈现
  2. text <- dput("یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے") "<U+06CC><U+06C1> <U+062C><U+0645><U+0644><U+06C1> <U+0627><U+06CC><U+06A9> <U+0645><U+062B><U+0627><U+0644> <U+06A9><U+06D2> <U+0644><U+06CC><U+06D2> <U+0627><U+0633><U+062A><U+0639><U+0645><U+0627><U+0644> <U+06A9><U+06CC> <U+0627> <U+062C><U+0627> <U+0631><U+06C1><U+0627> <U+06C1><U+06D2>" pattern <- dput("کیا جا") "<U+06A9><U+06CC><U+0627> <U+062C><U+0627>" replaceWith <- dput(paste0("<somemark>", pattern, "</somemark>")) "<somemark><U+06A9><U+06CC><U+0627> <U+062C><U+0627></somemark>" dput(gsub(pattern, replaceWith, text)) "<U+06CC><U+06C1> <U+062C><U+0645><U+0644><U+06C1> <U+0627><U+06CC><U+06A9> <U+0645><U+062B><U+0627><U+0644> <U+06A9><U+06D2> <U+0644><U+06CC><U+06D2> <U+0627><U+0633><U+062A><U+0639><U+0645><U+0627><U+0644> <somemark><U+06A9> <U+06CC><U+0627> <U+062C><U+0627></somemark> <U+0631><U+06C1><U+0627> <U+06C1><U+06D2>"

    1. 然后字符串继续从左到右的字符。它从左到右渲染,并在末尾添加(先前渲染的左侧),
    2. یہ جملہ ایک مثال کے لیے استعمال

      1. 然后字符串继续从右到左字符。它从右到左呈现,最后添加,
      2. یہ جملہ ایک مثال کے لیے استعمال <somemark>

        1. 然后字符串继续从左到右的字符。它从左到右呈现,最后添加,
        2. یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا

          1. 最后字符串以从右到左的字符结尾。它从右到左呈现,并在末尾添加。
          2. یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark>

            你对应该渲染的内容的看法在我看来并不合理,但我必须承认我没有左右文本渲染的经验。

            无论如何,如果格式必须由渲染器解释,例如HTML中的یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark> رہا ہے标签,那么它完美地工作(在markdown / html中):

            <b>...</b>

            呈现为

            یہجملہایکمثالکےلیےاستعمالکیاجارہاہے

            我还没有设法打印出任何闪亮的问号:

            یہ جملہ ایک مثال کے لیے استعمال <b>کیا جا</b> رہا ہے

答案 1 :(得分:1)

我试一试。不过,我确实冒了对args进行硬编码而不是从会话中读取的自由。

Server: 

output$mysub <- function(){ # (text=NULL, pattern=NULL)

text <- "یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے"
pattern <- "کیا جا"

Encoding(text) <- "UTF-8"
Encoding(pattern) <- "UTF-8"

print(text)

beforePattern <- substr(text, 1, regexpr(pattern, text)[1]-1)
afterPattern <- substr(text, regexpr(pattern,text)[1] + nchar(pattern), nchar(text))

replaceWith <- paste0("<somemark>", pattern, "</somemark>")
result <- paste(afterPattern, replaceWith, beforePattern)

# result <- paste( beforePattern, replaceWith, afterPattern)
# Encoding(result) <- "UTF-8"
print(length(result))
print(result)

return(result)
}


# ui.R: 

h2( textOutput("mysub") )

我在闪亮的网页上得到的输出是: bidi text output