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

grails .gsp changes the 'ñ' to 'ñ' when it reaches the controller #13350

Open
funcoleto opened this issue Jan 13, 2024 · 6 comments
Open

Comments

@funcoleto
Copy link

funcoleto commented Jan 13, 2024

Expected Behavior

When I put characters with an accent or 'ñ' in some string field, instead of reaching the controller, the literal text arrives changed if they are special characters

Actual Behaviour

I put a 'ñ, ó á é' in the string input text .gsp view...... and when they already travel to the controller, they have already changed to these values 'ñ , ó á é'..

Steps To Reproduce

1._ bootrun proyect
2._ register like propietario with some special character ñ, ó, á, etc..
3._ and in the database you can see that they are not the same characters, they arrive at the controller already changed

Environment Information

development, production

Grails Version: 6.1.1
JVM Version: 11.0.16
Groovy Version: 4.0.15
OS: Mac OS X
openjdk 11.0.21 2023-10-17 LTS
OpenJDK Runtime Environment Corretto-11.0.21.9.1 (build 11.0.21+9-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.21.9.1 (build 11.0.21+9-LTS, mixed mode)
intellij

Example Application

No response

Version

6.1.0

@guillermocalvo
Copy link
Contributor

Hi @funcoleto. I cannot reproduce the issue you are reporting. Could you please provide an example app that shows this behavior?

@funcoleto
Copy link
Author

with sample app grails-cas-encoding

curl -si -dstring=® http://localhost:8080/application
HTTP/1.1 200
X-Application-Context: application:development
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Date: Mon, 15 Jan 2024 10:34:52 GMT

string: ®

It's the same problem.. it always change special character..

@tonyerskine
Copy link

tonyerskine commented Mar 15, 2024

I'm unsure if this is helpful, but this thread helped me resolve the reverse problem. In my messages_es.properties, I had messages containing ñ character, but in the view, it resulted in a � character. So I replaced ñ with ñ, and it rendered in the HTML as ñ.

messages_es.properties

passwordService.exception.passwordReused=No puede utilizar una contraseña que haya utilizado antes.

Resulting message

No puede utilizar una contraseña que haya utilizado antes.

or in messages_fr.properties, é will give me é

passwordService.exception.passwordReused=Vous ne pouvez pas utiliser un mot de passe que vous avez utilisé auparavant.

results in this text

Vous ne pouvez pas utiliser un mot de passe que vous avez utilisé auparavant.

@monetschemist
Copy link

@funcoleto - I see Content-Type: text/html;charset=utf-8 in your response, which looks good.

Is your database encoding also UTF-8? Any chance it's ISO8859? For example with PostgreSQL you can easily see your database encoding by using the command psql -l at the shell prompt. Encoding is the third column.

Could it be your LC_* environment variables causing a problem? Supposedly PostgreSQL can determine your system encoding when the database is created by examining the LC_CTYPE environment variable.

In your gradle.properties file, do you see something like org.gradle.jvmargs=-Dfile.encoding=UTF-8?

In your grails-app/conf/application.yml file, do you see

grails:
  views:
    gsp:
      encoding: UTF-8

Take a look at your grails-app/conf/logback.xml file; it should indicate UTF-8 in the encoding and charset parameters. I don't imagine getting this wrong would cause the problem you're seeing.

Take a look at your grails-app/conf/spring/resources.groovy to see if there's a funky localeResolver() call.

Does your grails-app/views/layouts/main.gsp have a line like this in its head stanza:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

(I guess it must based on your results with curl above).

That's about all I can think of. For what it's worth, I have tons of data in the PostgreSQL back end in UTF-8 with accented characters etc and it all comes out fine.

@funcoleto
Copy link
Author

funcoleto commented Apr 4, 2024

On the traveling Mac it gives me problems when starting the project, on Sunday I test when I get home again,

On the travel mac it gives me this problem I think because of the gradle / groovy..

09:14:20: Executing 'bootRun --stacktrace'...


FAILURE: Build failed with an exception.

* Where:
Initialization script '/private/var/folders/y6/nk92j7m16nscvqcrfvlg7fpc0000gn/T/ijresolvers1.gradle' line: 136

* What went wrong:
Could not compile initialization script '/private/var/folders/y6/nk92j7m16nscvqcrfvlg7fpc0000gn/T/ijresolvers1.gradle'.
> startup failed:
  initialization script '/private/var/folders/y6/nk92j7m16nscvqcrfvlg7fpc0000gn/T/ijresolvers1.gradle': 136: unable to resolve class CommandLineArgumentProvider 
   @ line 136, column 73.
     CommandLineArgumentProvider() {
                                   ^
  
  initialization script '/private/var/folders/y6/nk92j7m16nscvqcrfvlg7fpc0000gn/T/ijresolvers1.gradle': 136: unable to resolve class CommandLineArgumentProvider 
   @ line 136, column 73.
     CommandLineArgumentProvider() {
                                   ^
  
  2 errors


* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.groovy.scripts.ScriptCompilationException: Could not compile initialization script '/private/var/folders/y6/nk92j7m16nscvqcrfvlg7fpc0000gn/T/ijresolvers1.gradle'.
	at org.gradle.groovy.scripts.internal.DefaultScriptCompilationHandler.wrapCompilationFailure(DefaultScriptCompilationHandler.java:192)
	at org.gradle.groovy.scripts.internal.DefaultScriptCompilationHandler.compileScript(DefaultScriptCompilationHandler.java:137)
	at org.gradle.groovy.scripts.internal.DefaultScriptCompilationHandler.compileToDir(DefaultScriptCompilationHandler.java:95)
	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$CompileToCrossBuildCacheAction.execute(FileCacheBackedScriptClassCompiler.java:153)
	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$CompileToCrossBuildCacheAction.execute(FileCacheBackedScriptClassCompiler.java:134)
	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$ProgressReportingInitializer.execute(FileCacheBackedScriptClassCompiler.java:177)
	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$ProgressReportingInitializer.execute(FileCacheBackedScriptClassCompiler.java:157)
	at org.gradle.cache.internal.DefaultPersistentDirectoryCache$Initializer.initialize(DefaultPersistentDirectoryCache.java:92)
	at org.gradle.cache.internal.FixedSharedModeCrossProcessCacheAccess$1.run(FixedSharedModeCrossProcessCacheAccess.java:73)
	at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.doWriteAction(DefaultFileLockManager.java:184)
	at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.writeFile(DefaultFileLockManager.java:174)
	at org.gradle.cache.internal.FixedSharedModeCrossProcessCacheAccess.open(FixedSharedModeCrossProcessCacheAccess.java:71)
	at org.gradle.cache.internal.DefaultCacheAccess.open(DefaultCacheAccess.java:127)
	at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:55)
	at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:30)
	at org.gradle.cache.internal.DefaultCacheFactory.doOpen(DefaultCacheFactory.java:89)
	at org.gradle.cache.internal.DefaultCacheFactory.open(DefaultCacheFactory.java:63)
	at org.gradle.cache.internal.DefaultCacheRepository$PersistentCacheBuilder.open(DefaultCacheRepository.java:116)
	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$RemapBuildScriptsAction.execute(FileCacheBackedScriptClassCompiler.java:349)
	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$RemapBuildScriptsAction.execute(FileCacheBackedScriptClassCompiler.java:325)
	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$ProgressReportingInitializer.execute(FileCacheBackedScriptClassCompiler.java:177)
	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$ProgressReportingInitializer.execute(FileCacheBackedScriptClassCompiler.java:157)
	at org.gradle.cache.internal.DefaultPersistentDirectoryCache$Initializer.initialize(DefaultPersistentDirectoryCache.java:92)
	at org.gradle.cache.internal.FixedSharedModeCrossProcessCacheAccess$1.run(FixedSharedModeCrossProcessCacheAccess.java:73)
	at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.doWriteAction(DefaultFileLockManager.java:184)
	at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.writeFile(DefaultFileLockManager.java:174)
	at org.gradle.cache.internal.FixedSharedModeCrossProcessCacheAccess.open(FixedSharedModeCrossProcessCacheAccess.java:71)
	at org.gradle.cache.internal.DefaultCacheAccess.open(DefaultCacheAccess.java:127)
	at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:55)
	at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:30)
	at org.gradle.cache.internal.DefaultCacheFactory.doOpen(DefaultCacheFactory.java:89)
	at org.gradle.cache.internal.DefaultCacheFactory.open(DefaultCacheFactory.java:63)
	at org.gradle.cache.internal.DefaultCacheRepository$PersistentCacheBuilder.open(DefaultCacheRepository.java:116)
	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler.compile(FileCacheBackedScriptClassCompiler.java:103)
	at org.gradle.groovy.scripts.internal.CrossBuildInMemoryCachingScriptClassCache.getOrCompile(CrossBuildInMemoryCachingScriptClassCache.java:52)
	at org.gradle.groovy.scripts.internal.BuildScopeInMemoryCachingScriptClassCompiler.compile(BuildScopeInMemoryCachingScriptClassCompiler.java:48)
	at org.gradle.groovy.scripts.DefaultScriptCompilerFactory$ScriptCompilerImpl.compile(DefaultScriptCompilerFactory.java:50)
	at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:166)
	at org.gradle.configuration.DefaultInitScriptProcessor.process(DefaultInitScriptProcessor.java:49)
	at org.gradle.initialization.InitScriptHandler$1.execute(InitScriptHandler.java:52)
	at org.gradle.initialization.InitScriptHandler$1.execute(InitScriptHandler.java:48)
	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61)
	at org.gradle.initialization.InitScriptHandler.executeScripts(InitScriptHandler.java:48)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:132)
	at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:112)
	at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:95)
	at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:66)
	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:50)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner$1.execute(RunAsBuildOperationBuildActionRunner.java:43)
	at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner$1.execute(RunAsBuildOperationBuildActionRunner.java:40)
	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
	at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40)
	at org.gradle.tooling.internal.provider.runner.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:88)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:49)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:31)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:46)
Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
initialization script '/private/var/folders/y6/nk92j7m16nscvqcrfvlg7fpc0000gn/T/ijresolvers1.gradle': 136: unable to resolve class CommandLineArgumentProvider 
 @ line 136, column 73.
   CommandLineArgumentProvider() {
                                 ^

initialization script '/private/var/folders/y6/nk92j7m16nscvqcrfvlg7fpc0000gn/T/ijresolvers1.gradle': 136: unable to resolve class CommandLineArgumentProvider 
 @ line 136, column 73.
   CommandLineArgumentProvider() {
                                 ^

2 errors

	at org.gradle.groovy.scripts.internal.DefaultScriptCompilationHandler.compileScript(DefaultScriptCompilationHandler.java:135)
	... 89 more


BUILD FAILED

Total time: 0.459 secs
09:14:21: Execution finished 'bootRun --stacktrace'.

@funcoleto
Copy link
Author

@funcoleto - I see Content-Type: text/html;charset=utf-8 in your response, which looks good.

Is your database encoding also UTF-8? Any chance it's ISO8859? For example with PostgreSQL you can easily see your database encoding by using the command psql -l at the shell prompt. Encoding is the third column.

Could it be your LC_* environment variables causing a problem? Supposedly PostgreSQL can determine your system encoding when the database is created by examining the LC_CTYPE environment variable.

In your gradle.properties file, do you see something like org.gradle.jvmargs=-Dfile.encoding=UTF-8?

In your grails-app/conf/application.yml file, do you see

grails:
  views:
    gsp:
      encoding: UTF-8

Take a look at your grails-app/conf/logback.xml file; it should indicate UTF-8 in the encoding and charset parameters. I don't imagine getting this wrong would cause the problem you're seeing.

Take a look at your grails-app/conf/spring/resources.groovy to see if there's a funky localeResolver() call.

Does your grails-app/views/layouts/main.gsp have a line like this in its head stanza:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

(I guess it must based on your results with curl above).

That's about all I can think of. For what it's worth, I have tons of data in the PostgreSQL back end in UTF-8 with accented characters etc and it all comes out fine.

In the project "sample app grails-cas-encoding"Everything put above is position, the database does not act therefore the database is discarded, in the project "grails-cas-encoding" This was missing (> Take a look at your grails-app/conf/spring/resources.groovy to see if there's a funky localeResolver() call.) But I've put it on and it still doesn't work:

terminal:
example1:
curl -si -dstring=ñ http://localhost:8080/application

HTTP/1.1 200
X-Application-Context: application:development
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Date: Mon, 08 Apr 2024 21:47:47 GMT

string: ñ

example2:
curl -si -dstring=® http://localhost:8080/application

HTTP/1.1 200
X-Application-Context: application:development
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Date: Mon, 08 Apr 2024 21:47:30 GMT

string: ®

If you start the project and go to the browser and put:
http://localhost:8080/application?string=ñ

The result is:
string: ñ

I'm with intellij and the whole project is with utf8

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants