Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't escape valid Unicode characters in strings #36174

Open
sonacy opened this issue Jan 14, 2020 · 8 comments
Open

Don't escape valid Unicode characters in strings #36174

sonacy opened this issue Jan 14, 2020 · 8 comments
Labels
Bug A bug in TypeScript Effort: Difficult Good luck. Help Wanted You can do this
Milestone

Comments

@sonacy
Copy link

sonacy commented Jan 14, 2020

TypeScript Version: 3.7.4

Code

const sf = createSourceFile(
  'aaa',
  'const a: string = "哈哈"',
  ScriptTarget.Latest
)
// try to do sth in transfrom.
const result = transform(sf, [])
const printer = createPrinter()
const printed = printer.printNode(
  EmitHint.SourceFile,
  result.transformed[0],
  sf
)
console.log(printed)

Expected behavior:
const a: string = "哈哈"

Actual behavior:
const a: string = "\u54C8\u54C8";

I am trying to use compiler api to do some transform. but the Printer seems could not generate the decoded unicode characters. wonder how to do this right?

@sonacy
Copy link
Author

sonacy commented Jan 14, 2020

i am seeing the api here.

const realPath = path.resolve(__dirname, './utf8.ts')
const program = createProgram([realPath], {
  target: ScriptTarget.ES2017,
  module: ModuleKind.ES2015,
  allowJs: true,
  jsx: JsxEmit.Preserve,
})
// use it, got expected answer
// program.getTypeChecker()
const result = transform(sf, [])
const printer = createPrinter()
const printed = printer.printNode(
  EmitHint.SourceFile,
  result.transformed[0],
  sf
)
console.log(printed)

same here, use the program api, the file content is basic: 'const a: string = "哈哈"'.
but got result: const a: string = "\u54C8\u54C8";
but when i use: program.getTypeChecker(), i got expected answer like: const a: string = "哈哈".
wonder why this happens?

@DanielRosenwasser
Copy link
Member

It's not that you're doing anything wrong - our implementation just escapes any characters outside of the printable range of ASCII characters. Nowadays e might be equipped to do a little better given that we have the set of valid unicode identifier characters.

Is there a reason this emit is a problem for you?

@GilbertSun
Copy link

GilbertSun commented Jan 14, 2020

characters

we use the transform api to deal our source code, for example

const a:string = '哈哈' => const a: string = i18n('哈哈'), so we can search our codebase to replace all the chinese string to use i18n, but if typescript escapes any characters outside of the printable range of ASCII characters, our code base will be wired

is there any solutions let me keep my chinese string, thanks

@RyanCavanaugh RyanCavanaugh added the Bug A bug in TypeScript label Jan 14, 2020
@RyanCavanaugh RyanCavanaugh added this to the Backlog milestone Jan 14, 2020
@RyanCavanaugh
Copy link
Member

I don't think we should escape these unless there's some hard necessity.

@DanielRosenwasser DanielRosenwasser added Effort: Difficult Good luck. Help Wanted You can do this labels Jan 14, 2020
@DanielRosenwasser
Copy link
Member

DanielRosenwasser commented Jan 14, 2020

No, it was strictly ease of implementation at the time. I'm marking this as Difficult because any contribution needs very thorough test code.

@DanielRosenwasser DanielRosenwasser changed the title printer for unicode Don't escape valid Unicode characters in strings Jan 14, 2020
@git9am
Copy link

git9am commented Mar 11, 2020

Hitting same issue. Our workaround:

    let content = printer.printFile(file);
    content = unescape(content.replace(/\\u/g, "%u"));

@Grawl
Copy link

Grawl commented Feb 24, 2024

backlog since 2020

image

@RyanCavanaugh
Copy link
Member

Backlog = PRs accepted, be the change you want to see in the world 😇

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug A bug in TypeScript Effort: Difficult Good luck. Help Wanted You can do this
Projects
None yet
Development

No branches or pull requests

6 participants